如 ideone 上所示:
cout << string(50, 'x'); // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
cout << string{50, 'x'}; // 2x
什么?
我发现 50 是 ASCII '2',所以:
cout << static_cast<int>('2'); // 50
cout << static_cast<char>(50); // 2
但这就是我所能得到的。
这是否会引发反对 C++11 初始化器的有力论据?
最佳答案
当您执行string { 50, 'x' }
时,您实际上是在使用字符列表初始化字符串。
另一方面,string(50, 'x')
调用一个有 2 个参数的构造函数,该构造函数被定义为重复字符 x
50 次。 string { 50, 'x' }
不选择构造函数的原因是它可能不明确。如果您还有一个三参数构造函数怎么办?如果该类型具有 initializer_list
构造函数,那么当您使用 { ... }
进行初始化时,将会选择它。
基本上,您需要了解您的类型具有的构造函数。 initializer_list
构造函数始终具有优先级以避免歧义。
关于C++11: string(50, 'x' ) 与 string{50, 'x' },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27063811/