c++ - 构造函数中初始化列表的评估顺序是否固定?

标签 c++ language-lawyer c++17 operator-precedence

我的印象是下面容易泄露

class Something {
    std::unique_ptr<A> a;
    std::unique_ptr<int> b{new int{3}};
    std::unique_ptr<C> c;
public:
    Something() : a{new A{}}, c{new C{}} {};
};

如果评估顺序如下

  1. 新 A{}
  2. 新整数{3}
  3. 新 C{}
  4. 一个{}
  5. b{}
  6. c{}

我正在查看新的 C++17 功能 ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf ),它修复了以前版本的 C++ 中的求值顺序错误,但它似乎只讨论了函数参数求值。

我查看了关于评估顺序的 cppreference 文档 (http://en.cppreference.com/w/cpp/language/eval_order),它似乎也没有提到这一点。

以上是否有明确定义的评估顺序? (现在在 C++17 或以前版本的 C++ 中)

最佳答案

不,该命令是不允许的;语言没有那么疯狂。

这些是完全不同的完整表达式,所以它由 [intro.execution]/16 控制:

Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.

关于c++ - 构造函数中初始化列表的评估顺序是否固定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988879/

相关文章:

c++ - 十六进制浮点字面量

swift 2.0 : Parametrized classes don't call proper == function if it inherits from class that is Equatable

c++ - 弃用隐式声明的复制构造函数

c++ - 浮点成员是否保证使用 {} 语法初始化为零?

c++ - std::string SSO 调整

c++ - 使用默认参数匹配模板模板参数

c++ - 与/usr/bin/openssl 输出相同的 C/C++ 程序

c - 外部声明,T* v/s T[]

c++ - C++11 中的 union : default constructor seems to be deleted

c++ - std::launder 的目的是什么?