C ++ 11和通用初始化器约定

时间:2016-01-08 13:20:05

标签: c++ c++11 deprecated c++03 initializer

C ++ 11带来了新的通用初始化器,它可以很好用。问题:初始化对象的任何旧语法都被认为是不推荐使用的。在C ++ 03中,对象可以初始化为

  1. Foo bar(x)
  2. Foo bar=Foo(x)
  3. 选项(1)是首选,因为它不涉及副本。在C ++ 11中有更多方法:

    1. Foo bar{x}
    2. auto bar=Foo{x}
    3. 使用移动构造函数和赋值运算符,选项(4)也应该没问题。 (1)是否被认为是赞成(3)或(4)?

      此外,在C ++ 03中,规则是所有采用一个参数的构造函数都应该是显式的(复制ctor除外)。其他构造函数总是明确的。对于广义初始化器,任何ctor都可以是隐式的。然后,新规则是在任何地方显式显示,或者只是转换意味着副作用(分配一堆内存,创建文件......)或者是有损的(浮动的两倍)?

1 个答案:

答案 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}}。