Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用作成员构造函数参数的函数的求值顺序_C++_C++11_C++17 - Fatal编程技术网

C++ 用作成员构造函数参数的函数的求值顺序

C++ 用作成员构造函数参数的函数的求值顺序,c++,c++11,c++17,C++,C++11,C++17,让我们假设一个类: struct S { Obj1 o1; Obj2 o2; S() : o2( fn2() ), o1( fn1(), fn3() ) {} }; 在这种情况下,之前保证对什么进行排序?o1()在o2()之前排序。fn1()和fn3()在o1()之前排序,fn2()在o2()之前排序。问题是fns的序列。据我所知,fn1()和fn3()可以按未指定的顺序进行。fn1()和fn3()是否保证在fn2()之前排序 一个完整的表达是 (12.3)-初始声明

让我们假设一个类:

struct S {
    Obj1 o1;
    Obj2 o2;

    S() : o2( fn2() ), o1( fn1(), fn3() ) {}
};
在这种情况下,之前保证对什么进行排序?o1()在o2()之前排序。fn1()和fn3()在o1()之前排序,fn2()在o2()之前排序。问题是fns的序列。据我所知,fn1()和fn3()可以按未指定的顺序进行。fn1()和fn3()是否保证在fn2()之前排序

一个完整的表达是

(12.3)-初始声明人(第11条)或mem初始值设定人(15.6.2),包括初始值设定人的组成表达式

与完整表达式关联的每个值计算和副作用在与要计算的下一个完整表达式关联的每个值计算和副作用之前排序

因此,调用
o1(fn1(),fn3())
及其所有子表达式和副作用在调用
o2(fn2())
之前进行排序

如果您仍然不相信,以下是非规范性说明:

[注:每个mem初始值设定项执行的初始化构成完整表达式(4.6)。mem初始值设定项中的任何表达式都作为执行初始化的完整表达式的一部分进行计算。-结束注]

一个完整的表达是

(12.3)-初始声明人(第11条)或mem初始值设定人(15.6.2),包括初始值设定人的组成表达式

与完整表达式关联的每个值计算和副作用在与要计算的下一个完整表达式关联的每个值计算和副作用之前排序

因此,调用
o1(fn1(),fn3())
及其所有子表达式和副作用在调用
o2(fn2())
之前进行排序

如果您仍然不相信,以下是非规范性说明:

[注:每个mem初始值设定项执行的初始化构成完整表达式(4.6)。mem初始值设定项中的任何表达式都作为执行初始化的完整表达式的一部分进行计算。-结束注]


你的意思可能是说,o2(fn2())是seqdB4,其他的一切。不,我没有。为什么?不,他们不是。“[class.base.init]/13在非委托构造函数中,初始化按以下顺序进行:……然后,非静态数据成员按照在类定义中声明的顺序进行初始化(同样,与mem初始值设定项的顺序无关)。”澄清问题:这是否同样适用于c++11和17?(在17年,围绕这一点的一些东西没有改变,以填补编译器能够以任意顺序执行fn1、2和3的漏洞吗?@AndreKostur-有一个变化与某些特定情况有关(例如
E1,你可能指的是
o2(fn2())
是seqdB4其他所有内容。不,我没有。为什么?不,它们不是。“[class.base.init]/13在非委托构造函数中,初始化按以下顺序进行:……然后,非静态数据成员按类定义中声明的顺序进行初始化(同样,与mem初始值设定项的顺序无关)。“澄清问题:这是否同样适用于c++11和17?(17年,围绕这一点的一些东西没有改变,以填补编译器能够以任意顺序执行fn1、2和3的漏洞吗?@AndreKostur-有一个与某些特定情况相关的变化(例如
E1)