我最近正在从事一个C++项目,遇到了一个我无法完全理解的字符串构造函数的案例。相关代码(you can run here)如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string directParens(1, '*');
string directBraces{1, '*'};
string indirectBraces = {1, '*'};
cout << directParens.size() << endl; // 1
cout << directBraces.size() << endl; // 2
cout << indirectBraces.size() << endl; // 2
return 0;
}
括号的大括号初始化版本最终在其中包含两个字符,即,数值为1的
char
,后跟一个星号。我不明白为什么括号的大括号初始化版本会调用
initializer_list
构造函数,而不是采用大小和字符的构造函数。 initializer_list
构造函数具有以下签名:basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
假设
string
是basic_string
char的别名,则特定签名为string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
初始化程序
{1, '*'}
(包含int
类型和char
类型的元素)如何与此构造函数匹配?我的印象是std::initializer_list
中的所有文字都必须具有相同的类型-这不正确吗? 最佳答案
因为文字1
和字符'*'
都可以转换为char
,而无需使用缩小转换。因此,他们有资格调用initializer_list<char>
构造函数。使用列表初始化时,initializer_list
构造函数始终具有优先级。如果可以从参数中调用initializer_list
构造函数,则可以。
除非您打算使列表中的元素成为容器的元素,否则切勿对容器使用braced-init-lists。如果希望将它们用作构造函数参数,请使用构造函数。