有人可以向我解释一下这个输出背后的原因和逻辑吗?

时间:2014-06-30 06:45:03

标签: c++ constructor logic function-signature

#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
有人可以帮我理解输出顺序背后的原因吗?

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,它们被破坏的顺序与它们的构造顺序相反。