为什么此代码将字符串初始化为单个字符时调用initializer_list构造函数?
我最近正在研究一个C++项目,并遇到了一个我不能完全理解的字符串构造函数的边界案例。相关的代码(其you can run here)如下:为什么此代码将字符串初始化为单个字符时调用initializer_list构造函数?
#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
字符的别名,具体的签名会
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
如何初始化{1, '*'}
,其中包含的元素int
类型都和类型为char
,与此构造函数匹配?我的印象是,std::initializer_list
中的所有文字必须具有相同的字体 - 这是不正确的吗?
初始值设定项{1,'*'}如何与此构造函数匹配,包含int类型和char类型的元素?
由于字面1
和字符'*'
两者都转换为char
不使用收缩转换。因此,他们有资格拨打initializer_list<char>
构造函数。和initializer_list
构造函数总是使用列表初始化时有优先权。如果可以从参数调用initializer_list
构造函数,那么它将会。
切勿使用支撑-INIT-名单与除非你打算在列表中的元素容器是元素的容器的。如果你打算将它们作为构造函数参数,则使用构造函数。
啊,呃。因此,如果所有元素都可以转换为基础类型而不缩小转换,则大括号初始化器将被解释为initializer_list。为了确认,这是否意味着{3,3.0}可以被解释为initializer_list
@templatetypedef:那么,'{INT_MAX,'*'}'示例*不能*为'initializer_list
哦,我认为缩小转换适用于*类型*,而不是*值。*清除了一些东西!谢谢! – templatetypedef
请注意,缩小转换有一个例外[对于常量表达式,其转换后的结果将符合目标类型](https://stackoverflow.com/a/26974911/1708801) –