最近,由于使用“现代”“直接列表初始化”语法,我在代码中发现了一个错误。问题的要旨如下:
#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
?