你能猜出这个简单程序的输出吗?
#include <vector>
#include <string>
#include <exception>
#include <iostream>
using namespace std;
int main()
{
try {
struct X {
explicit X(int) {}
X(string) {} // Just to confuse you more...
};
vector<X>{"a", "b"};
} catch (exception& x) {
cerr << x.what();
}
}
好吧,我不能,这花了我一天的时间“研究”,然后才登陆这里,最终从一些复杂的现实生活代码中提取出来(到处都是类型别名,匿名。与非 POD 成员的联合以及手工 -精心策划的演员/导演等,只是为了营造氛围)。
而且……我还是看不出发生了什么!有人可以给一个温柔的提示吗?(希望只是一个盲点。我不再专业地从事 C++ 工作。)
注意:使用(最新的)MSVC/W4
和 GCC进行干净编译* -Wall
;两者的输出相同(语义上)。
* 即使没有“迷惑读者”这句话。我想我会做噩梦。
(请耐心等待,我尽量不把所有内容都拼写得更详细,以免剧透——毕竟,这确实是不言自明的,对吧?除了,对我来说恰恰相反……)
这
const char*
使用带有两个迭代器的构造函数从两个类型的迭代器创建一个向量:只是运气不好,两个 s 的衰减
const char[]
变成了满足LegacyInputIterator要求的完美迭代器。迭代器不指向数组/连续区域,因此程序具有未定义的行为。
在幕后发生的事情很可能是它会尝试从第一个
const char*
到第二个,并在通过 后的空终止符时立即超出范围'a'
。实际可行的类似结构: