C++11 和广义初始化器约定

C++11 and generalized initializers conventions

C++11 带来了新的通用初始化器,这可能很好。问题:是否有任何用于初始化对象的旧语法被认为已弃用。在 C++03 中,对象可以初始化为

  1. Foo bar(x)
  2. Foo bar=Foo(x)

首选选项(1),因为它不涉及副本。在 C++11 中有更多方法:

  1. Foo bar{x}
  2. auto bar=Foo{x}

对于移动构造函数和赋值运算符,选项 (4) 也应该没问题。 (1) 是否被认为已弃用,取而代之的是 (3) 或 (4)?

此外,在 C++03 中,规则是所有接受一个参数的构造函数都应该是显式的(复制构造函数除外)。其他构造函数总是显式的。使用广义初始化器,任何构造函数都可以是隐式的。那么新规则是在任何地方都显式放置,还是只是在转换会产生副作用(分配一堆内存,创建文件......)或有损(双浮点)的地方?

Is (1) considered deprecated in favor of (3) or (4)?

弃用可能不是最好的选择。如果可能,brace-initialization 是 首选。我提到这个是因为 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}.

演员之间的行为有所不同;因此,说应该放弃 (1) 来代替 (3) 或 (4) 是不公平的。

这个例子回答了你的第二个问题:

Is the new rule then to put explicit everywhere ... ?

是的。因为会有歧义,您不希望编译器尝试解析它 - 将其标记为 explicit.