C ++ 11带来了新的通用初始化器,它可以很好用。问题:初始化对象的任何旧语法都被认为是不推荐使用的。在C ++ 03中,对象可以初始化为
Foo bar(x)
Foo bar=Foo(x)
选项(1)是首选,因为它不涉及副本。在C ++ 11中有更多方法:
Foo bar{x}
auto bar=Foo{x}
使用移动构造函数和赋值运算符,选项(4)也应该没问题。 (1)是否被认为是赞成(3)或(4)?
此外,在C ++ 03中,规则是所有采用一个参数的构造函数都应该是显式的(复制ctor除外)。其他构造函数总是明确的。对于广义初始化器,任何ctor都可以是隐式的。然后,新规则是在任何地方显式显示,或者只是转换意味着副作用(分配一堆内存,创建文件......)或者是有损的(浮动的两倍)?
答案 0 :(得分:3)
(1)是否被认为弃用赞成(3)或(4)?
不推荐可能不是最好的选择。如果可能,大括号初始化首选。我之所以提到这一点,是因为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}.
的构造函数:
explicit
ctors之间的行为存在差异;因此,不应该说(1)应该放弃代替(3)或(4)。
这个例子回答了你的第二个问题:
然后新规则是
explicit
到处......?
是。由于存在歧义,您不希望编译器尝试解决它 - 将其标记为{{1}}。