C++ - 带有 std::string 的统一初始值设定项

标签 c++ string c++11 uniform-initialization list-initialization

我正在尝试使用 C++ 字符串类的统一初始化器。下面是代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str1 {"aaaaa"};
    string str2 {5, 'a'};
    string str3 (5, 'a');

    cout << "str1: " << str1 << endl;
    cout << "str2: " << str2 << endl;
    cout << "str3: " << str3 << endl;

    return 0;
}

输出将是:

str1: aaaaa
str2: a
str3: aaaaa

这让我挠了挠头。为什么str2无法达到str3的预期效果?

最佳答案

std::string有一个采用 initializer_list 参数的构造函数。

basic_string( std::initializer_list<CharT> init,
              const Allocator& alloc = Allocator() );

当您使用 braced-init-list 构造 std::string 时,该构造函数总是优先。只有当 braced-init-list 中的元素不能转换为 initializer_list 中的元素类型时,才会考虑其他构造函数。 [over.match.list]/1 中提到了这一点.

Initially, the candidate functions are the initializer-list constructors ([dcl.init.list]) of the class T and the argument list consists of the initializer list as a single argument.

在您的示例中,第一个参数 5 可隐式转换为 char,因此 initializer_list 构造函数是可行的,并且它被选中。

如果您将字符串中的每个字符打印为 ints

,这是显而易见的
void print(char const *prefix, string& s)
{
    cout << prefix << s << ", size " << s.size() << ": ";
    for(int c : s) cout << c << ' ';
    cout << '\n';
}

string str1 {"aaaaa"};
string str2 {5, 'a'};
string str3 (5, 'a');

print("str1: ", str1);
print("str2: ", str2);
print("str3: ", str3);

输出:

str1: aaaaa, size 5: 97 97 97 97 97 
str2: a, size 2: 5 97 
str3: aaaaa, size 5: 97 97 97 97 97 

Live demo

关于C++ - 带有 std::string 的统一初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38809275/

相关文章:

c++ 相当于 $obj->{$var}

c++ - 重载 <brace-enclosed initializer list> 的调用不明确,如何处理?

c# - 有人可以帮我将多个字符串数组分配给一个二维字符串数组吗?

python:将 float 转换为字符串时,在点后强制加两个零

c++ - atomic fetch_add 与添加性能

c++ - 通过强度值归一化图像的颜色 channel ,OpenCV

需要文件 io 的 c++ 跨平台方法

javascript - 如何提高Javascript/破解代码算法的性能?

c++ - 我们不能在本地类中定义友元函数的原因是什么?

c++ - 如何在 Qt Creator 中启用 C++11?