#include <conio.h>
#include <iostream>
using namespace std;
class A {
int i;
public:
A(int i) : i(i) { cout << i << endl; }
A(const A &o) : i(o.i) { cout << i << endl; }
~A() { cout << i << endl; }
friend A f(const A &, A, A *);
};
A f(const A &a, A b, A *c) { return *c; }
int main() {
f(1, A(2), &A(3));
}
输出:1 3 2 3 2 3 3 1
有人可以帮我理解输出顺序背后的原因吗?
答案 0 :(得分:0)
未定义函数参数的评估顺序;它们可以按任何顺序构建。
作为对此的证明,这里有一些经验证据。
我进行了一些小修改,以便在单行上打印输出,同时显示每个ctor
的构造copy
,复制构造dtor
和破坏A
以及删除因使用&A(3)
而导致的未定义行为。
#include <conio.h>
#include <iostream>
using namespace std;
class A {
int i;
public:
A(int i) : i(i) { cout << "ctor" << i << " "; }
A(const A &o) : i(o.i) { cout << "copy" << i << " "; }
~A() { cout << "dtor" << i << " "; }
friend A f(const A &, A, A *);
};
void f(const A &a, A b, A&& c) { ; }
int main() {
f(1, A(2), A(3));
}
使用GCC 4.9,我得到ctor3 ctor2 ctor1 dtor1 dtor2 dtor3
。
使用MSVC 2013.2,我得到ctor1 ctor3 ctor2 dtor2 dtor3 dtor1
。
撇开; IRC,它们被破坏的顺序与它们的构造顺序相反。