相关疑难解决方法(0)

从恰好两个字符串文字构造结构向量(使用一些自定义构造函数)会崩溃。为什么?

你能猜出这个简单程序的输出吗?

\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}\n
Run Code Online (Sandbox Code Playgroud)\n

好吧,我不能,这花了我一天的时间“研究”,然后才登陆这里,最终从一些复杂的现实生活代码中提取出来(到处都是类型别名,匿名。与非 POD 成员的联合以及手工 -精心策划的演员/导演等,只是为了营造氛围)。

\n

而且……我还是看不出发生了什么!有人可以给一个温柔的提示吗?(希望只是一个盲点。我不再专业地从事 C++ 工作。)

\n

注意:使用(最新的)MSVC/W4和 GCC进行干净编译* -Wall;两者的输出相同(语义上)。

\n

* 即使没有“迷惑读者”这句话。我想我会做噩梦。

\n
\n

(请耐心等待我尽量不将所有内容拼写得更多 \xe2\x80\x94 毕竟,这确实是不言自明的,对吧?除了,对我来说完全相反......)

\n

c++ vector overload-resolution list-initialization

25
推荐指数
1
解决办法
1577
查看次数

使用双花​​括号进行向量初始化:std::string 与 int

在这个问题的回答中:用双花括号初始化向量<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中的一个调用构造函数。

为什么会出现这种行为差异的原因呢?

c++ initializer-list overload-resolution c++14

7
推荐指数
1
解决办法
3580
查看次数