C ++ - 使用std :: string的统一初始化程序

时间:2016-08-06 22:25:00

标签: 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所需的结果?

2 个答案:

答案 0 :(得分:9)

你正在使用std::string's constructor这个siganture

var pgtools = require('pgtools');

// This can also be a connection string
// (in which case the database part is ignored and replaced with postgres)

const config = {
  user: 'postgres',
  password: 'some pass',
  port: 5432,
  host: 'localhost'
}


pgtools.dropdb(config, 'test-db', function (err, res) {
  if (err) {
    console.error(err);
    process.exit(-1);
  }
  console.log(res);
});

编译器将std::basic_string( std::initializer_list<CharT> init, const Allocator& alloc = Allocator() ); 视为5类型,转换为未在屏幕上打印的char类型。如果您将ASCII更改为可打印值,请说明{ASCII值为5的{​​{1}},

A

它会打印出来:

65

请参阅Live on Coliru,并附上说明

答案 1 :(得分:5)

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中提到。

  

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

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

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

,则很明显
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