Я пытался заставить CTAD работать с std::map, но не могу заставить его работать.
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
using namespace std::string_literals;
int main() {
std::vector v{1,2,3}; // ok
std::map m{{4, "four"s},{7,"seven"s},{1,"one"s},{5,"five"s}}; // error
}
Есть ли способ заставить его работать, или std::map слишком сложно, чтобы он работал?
Проблема в том, что списки инициализаторов не имеют типа, поэтому очень сложно попытаться вывести его. По большей части CTAD не будет работать с вложенными списками.





Проблема в том, что это std::map m{{4, "four"s},{7,"seven"s},{1,"one"s},{5,"five"s}}; // error является {} из {}, а CTAD этого не делает.
Если вы сделаете std::map m{std::pair{4, "four"s},{7,"seven"s},{1,"one"s},{5,"five"s}};, он станет списком инициализаторов, над которым работает CTAD.
Да, я понимаю. Но не может, не должен или не должен компилятор видеть, что внутренние списки инициализации являются парными инициализаторами? Я думаю, что можно было бы создать дедуктивное руководство по этому поводу?
@towi Как я уже сказал, CTAD этого не делает. «Мог бы» не имеет значения; если вы хотите знать, почему CTAD этого не делает, вы можете задать новый вопрос и надеяться, что кто-то, кто посещал встречи по стандартам по этой теме, высказал свое мнение.
Строка с комментариями компилируется для меня, как только я изменяю первую пару на
std::pair{4, "four"s}, так что не все так плохо.