C++ 11:string(50,'x')与string {50,'x'}

P i*_*P i 4 constructor initializer undefined-behavior c++11

正如ideone所见:

cout << string(50, 'x'); // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
cout << string{50, 'x'}; // 2x
Run Code Online (Sandbox Code Playgroud)

WAT?

我已经发现50是ASCII'2',所以:

cout << static_cast<int>('2'); // 50
cout << static_cast<char>(50); // 2
Run Code Online (Sandbox Code Playgroud)

但就我而言,这就是我的意思.

这是否会导致针对C++ 11初始值设定项的可靠论据?

Jak*_*old 6

当你这样做时,string { 50, 'x' }你实际上是用字符列表初始化字符串.

另一方面,string(50, 'x')调用一个2参数构造函数,定义为重复该字符x50次.string { 50, 'x' }不选择构造函数的原因是它可能不明确.如果你有一个三参数构造函数怎么办?如果类型具有initializer_list构造函数,则在{ ... }用于初始化时将选择它.

基本上你需要知道你的类型有的构造函数.该initializer_list构造函数将永远有一个优先级,以避免歧义.