为什么此代码将字符串初始化为单个字符调用initializer_list构造函数

Why does this code to initialize a string to a single character call the initializer_list constructor?

本文关键字:调用 字符 initializer 构造函数 list 单个 代码 字符串 初始化 为什么      更新时间:2023-10-16

我最近正在从事一个C 项目,并遇到了一个我无法完全理解的字符串构造函数的边缘箱。相关代码(您可以在此处运行)如下:

#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());

鉴于stringbasic_string char的别名,特定的签名将为

string(std::initializer_list<char> init, 
       const Allocator& alloc = Allocator());

初始化器{1, '*'}如何包含类型int和类型char的元素,与此构造函数匹配?我的印象是std::initializer_list中的所有文字都必须具有相同的类型 - 这是不正确的吗?

initializer {1,'*'}如何包含类型int和类型char的元素,匹配此构造函数?

因为文字1和字符'*'均可转换为char,而无需使用狭窄的转换。因此,它们有资格称为initializer_list<char>构造函数。initializer_list构造函数始终在使用列表初始化时具有优先级。如果可以从参数调用initializer_list构造函数,则将其。

切勿使用带有容器的支撑式列表,除非您打算将列表中的元素为容器的 elements 。如果您打算将它们作为构造函数参数,请使用构造函数。