我最近正在从事一个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());

假设stringbasic_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。如果希望将它们用作构造函数参数,请使用构造函数。

07-24 09:46
查看更多