1

我刚刚被这种看似无辜的尝试抓住了,该尝试使用统一的初始化语法调用采用大小和字符值的std::string构造函数:

std::string s{ 10, '\0' };

我认为这会创建一个长度为 10 的字符串,初始化为\0.

虽然它实际上调用了构造函数,该构造函数接受一个初始化列表,从而创建了一个长度为 2的字符串,初始化为{'\n', '\0'}!

请参阅Coliru 的演示

使用统一初始化时有没有办法避免这个陷阱?还是我只需要小心?

注意:之前也有人问过 类似的问题,但没有给出如何避免这种陷阱的答案。

4

1 回答 1

9

你只需要小心。

一般而言,当人们告诉您“使用统一初始化以使所有内容保持一致并且统一”时,请忽略它们。我的意思是,一定要使用统一初始化,但不要相信童话。

此外,请忽略功能的名称。

xkcd #927:

于 2017-05-10T22:00:12.543 回答