【问题标题】:Order of function calls when creating an object of a class创建类的对象时函数调用的顺序
【发布时间】:2023-02-09 21:00:42
【问题描述】:

[C++17]

我有一堂课:

class A
{
public:
    A(int a, int b) { }
};

和两个功能:

int get_a() { return 1; }
int get_b() { return 2; }

现在我构造一个对象:

A a{ get_a(), get_b() };

问题:在这种情况下是否保证函数求值的顺序总是get_a 然后是get_b

【问题讨论】:

    标签: c++ c++17 expression-evaluation


    【解决方案1】:

    不,根据order of evaluation ...

    ...在函数调用中,值计算和每个参数初始化的副作用是不确定的顺序关于任何其他参数的值计算和副作用。

    从这个 demo 可以看出,g++ 和 clang++ 以不同的顺序评估它们。

    【讨论】:

    • 你的例子不等同于我的 sn-p。通过初始化列表构造对象有一些保证,但我找不到它,这就是我问的原因。
    • 在列表初始化中,给定初始化器子句的每个值计算和副作用都在每个值计算和副作用之前排序,然后在大括号括起来的逗号分隔的初始化器列表中跟在它后面的任何初始化器子句相关联。
    猜你喜欢
    • 2019-07-25
    • 2014-01-21
    • 2013-03-07
    • 2022-01-23
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多