直接列表初始化,将使用哪个构造函数?

时间:2019-06-05 13:55:09

标签: c++ constructor initializer-list list-initialization

最近,由于使用“现代”“直接列表初始化”语法,我在代码中发现了一个错误。问题的要旨如下:

#include <iostream>
#include <string>

int main()
{   
    std::cout << std::string(static_cast<std::size_t>(2), 'y');
    std::cout << std::string{static_cast<std::size_t>(2), 'x'};

    return 0;
}

使用以下编译命令:

g++ -std=c++11 main.cpp && ./a.out | xxd

我得到以下结果:

00000000: 7979 0278                                yy.x

在这里我们可以看到字符串没有以相同的方式初始化。第一个使用fill字符串构造函数,该构造函数将char 'y'重复两次。但是对于第二个,似乎括号被解释为std::initializer_list<char>,因此在二进制输出中是0x02

g++clang++都产生相同的行为,所以我认为这是可以预期的。

然后的问题是,如何知道/何时将花括号解释为构造函数的参数列表或单个std::initializer_list

0 个答案:

没有答案