我正在尝试使用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
所需的结果?
答案 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