C ++ 11带来了新的通用初始化器,可能很好。问题:是否已废弃任何用于初始化对象的旧语法?在C ++ 03中,可以将对象初始化为
Foo bar(x)
Foo bar=Foo(x)
选项(1)是首选,因为它不涉及副本。在C ++ 11中,有更多方法:
Foo bar{x}
auto bar=Foo{x}
对于move构造函数和赋值运算符,选项(4)也应该很好。是否赞成(3)或(4)弃用(1)?
同样,在C ++ 03中,规则是所有带有一个参数的构造函数都应是显式的(复制ctor除外)。其他构造函数始终是显式的。使用通用的初始化程序,任何ctor都可以是隐式的。然后,新规则是否在所有地方都明确显示,或者只是在转换将隐含副作用(分配一堆内存,创建文件...)或有损(双精度浮点数)的地方?
是否赞成(3)或(4)弃用(1)?
不推荐使用的单词可能不是最佳选择。可能的话,最好使用花括号初始化。我提到这一点是因为Foo(x)
它并不总是与之相对应Foo{x}
。
考虑以下构造函数std::vector
:
std::vector<int> v1(10, 0); // Creates a vector of size 10 initialized with all 0's.
std::vector<int> v2{10, 0}; // Creates a vector with elements {10, 0}.
ctor之间的行为有所不同。因此,说(1)应该代替(3)或(4)放弃是不公平的。
此示例回答了您的第二个问题:
那么,新规则是
explicit
无处不在吗?
是。因为会有歧义,所以您不希望编译器尝试解决它-将其标记为explicit
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句