12

我正在尝试使用 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

4

2 回答 2

9

您正在使用带有此签名std::string的构造函数

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

并且编译器被5视为一种char类型,它转换为一种ASCII不在屏幕上打印的类型。如果将其更改5为可打印的值,请说出A其 ASCII 值是65

string str2 {65, 'a'};

它将打印:

Aa

在 Coliru 上观看它并附上额外的插图

于 2016-08-06T22:37:05.743 回答
9

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

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

当您使用花括号初始化列表构造时,该构造函数总是优先std::string。仅当括号初始化列表中的元素不可转换为initializer_list. 这在[over.match.list]/1中提到。

最初,候选函数是类的初始化列表构造函数([dcl.init.list]),T参数列表由初始化列表作为单个参数组成。

在您的示例中,第一个参数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 

现场演示

于 2016-08-06T22:48:25.857 回答