【问题标题】:C++11 and generalized initializers conventionsC++11 和通用初始化器约定
【发布时间】:2016-04-13 04:44:57
【问题描述】:

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

【问题讨论】:

  • 我认为你有几个很好的问题,但你真的应该将自己限制在每个“问题”一个问题上。 :)
  • 也许是的,但一切都与初始化程序有关。
  • 不确定,但 IMO 更合适的 2. 版本是 Foo bar = x (它与 1. 相同),为什么有人会明确地创建一个临时对象,只是为了调用 copy c'tor ?
  • @user877329:您可以从关于 SO 的现有问题列表中看到,我们不会将某个主题的所有问题捆绑到一个问题中。 :)
  • @luk32 @user877329 Foo bar = x 不会为显式 ctor 编译,建议用于单参数 ctor。无论如何,选项(2)和(4)的复制或移动将typically变为elided,所以不用担心。

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


【解决方案1】:

是否认为 (1) 已被 (3) 或 (4) 弃用?

Deprecated 可能不是词的最佳选择。在可能的情况下,首选大括号初始化。我提到这一点是因为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) 是不公平的。

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

那么新规则是否将explicit 放在任何地方...?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2018-10-11
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多