Может кто-нибудь объяснить мне причину и логику этого вывода?

#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
Может кто-нибудь, пожалуйста, помогите мне понять причину последовательности этого вывода?

-5

Решение

Порядок вычисления аргументов функции не определен; они могут быть построены в любом порядке.

В качестве демонстрации этого приведем некоторые эмпирические доказательства этого.

Я сделал небольшие изменения, чтобы напечатать вывод в одной строке, также показывая конструкцию 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, порядок, в котором они уничтожены, является обратным порядку, в котором они построены.

0

Другие решения


По вопросам рекламы [email protected]