你能猜出这个简单程序的输出吗?
\n#include <vector>\n#include <string>\n#include <exception>\n#include <iostream>\n\nint main()\n{\n try { \n struct X {\n explicit X(int) {}\n X(std::string) {} // Just to confuse you more...\n };\n std::vector<X>{"a", "b"};\n } catch (std::exception& x) {\n std::cerr << x.what();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n好吧,我不能,这花了我一天的时间“研究”,然后才登陆这里,最终从一些复杂的现实生活代码中提取出来(到处都是类型别名,匿名。与非 POD 成员的联合以及手工 -精心策划的演员/导演等,只是为了营造氛围)。
\n而且……我还是看不出发生了什么!有人可以给一个温柔的提示吗?(希望只是一个盲点。我不再专业地从事 C++ 工作。)
\n注意:使用(最新的)MSVC/W4和 GCC进行干净编译* -Wall;两者的输出相同(语义上)。
* 即使没有“迷惑读者”这句话。我想我会做噩梦。
\n(请耐心等待我尽量不将所有内容拼写得更多 \xe2\x80\x94 毕竟,这确实是不言自明的,对吧?除了,对我来说完全相反......)
\n在这个问题的回答中:用双花括号初始化向量<string>
结果表明
vector<string> v = {{"a", "b"}};
Run Code Online (Sandbox Code Playgroud)
将使用一个元素std::vector调用构造函数。因此向量中的第一个(也是唯一的)元素将由 构造。这会导致未定义的行为,但这超出了这里的重点。initializer_list{"a", "b"}
我发现的是
std::vector<int> v = {{2, 3}};
Run Code Online (Sandbox Code Playgroud)
将std::vector使用两个元素initializer_list中的一个调用构造函数。
为什么会出现这种行为差异的原因呢?