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

标签 c++11 constructor undefined-behavior initializer

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/

相关文章:

C++ 字符串连接优化

java - 构造函数采用与参数相同的类型有什么用? java

c# - 构造函数可以异步吗?

c - memcpy 别名 int 到 char 产生 UB?

c++ - 是否可以为 boost::random::uniform_int_distribution<> 设置确定性种子?

c++ - 在 C++11 中, `i +=++i + 1` 是否表现出未定义的行为?

c++ - 数组与 std::initializer_list 作为函数参数

angular - 为什么必须提供angular2组件构造函数参数

c - C 中变量的垃圾值是如何生成的?

c - 灵活的数组成员会导致未定义的行为吗?