你能猜出这个简单程序的输出吗?
\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有人能解释下面例子中用双花括号和单花括号初始化之间的行为差异吗?
代码#1:
vector<string> v = {"a", "b"};
string c(v[0] + v[1]);
cout << "c = " << c;
cout << "c.c_str() = " << c.c_str();
Run Code Online (Sandbox Code Playgroud)
输出#1:
c = ab
c.c_str() = ab
Run Code Online (Sandbox Code Playgroud)
代码#2:
vector<string> v = {{"a", "b"}};
string c(v[0] + v[1]);
cout << "c = " << c;
cout << "c.c_str() = " << c.c_str();
Run Code Online (Sandbox Code Playgroud)
输出#2:
c = a\acke?Z\
c.c_str() = a
Run Code Online (Sandbox Code Playgroud)