gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:58 25 4
gpt4 key购买 nike

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

最佳答案

Is (1) considered deprecated in favor of (3) or (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) 是不公平的。

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

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

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

关于C++11 和广义初始化器约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34678096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com