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