【发布时间】:2017-05-10 21:58:27
【问题描述】:
我刚刚被这个看似无辜的尝试抓住了,该尝试使用统一的初始化语法调用std::string constructor,它接受一个大小和一个字符值:
std::string s{ 10, '\0' };
我以为这会创建一个长度为 10 的字符串,初始化为 \0。
虽然它实际上调用了构造函数,该构造函数采用 initializer list 并因此创建了一个 长度为 2 的字符串,并以 {'\n', '\0'}!
在使用统一初始化时,有没有办法避免这个陷阱?还是我只需要小心点?
注意:之前有人问过Similar question,但没有给出如何避免这个陷阱的答案。
【问题讨论】:
-
我认为uniform initialization 上的维基百科条目很好地描述了它:“统一初始化不会取代构造函数语法,有时仍然需要它。如果一个类有一个初始化列表构造函数 (
TypeName(initializer_list<SomeType>);) ,则它优先于其他形式的构造,前提是初始化列表符合序列构造函数的类型。” -
@clcto 编译器似乎渴望使用初始化列表构造函数,即使列表包含不符合要求的类型 (Coliru example)。公平地说,有一个编译器警告。
-
@zett42:郑重声明,
[over.match.list]/1保证了这种行为;基本上;构造函数分两个阶段查找,如果存在任何初始化列表构造函数,那么无论好坏,这就是你得到的。
标签: c++ string c++11 uniform-initialization