2014-06-30 3 views
-5
#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

У вас есть неопределенное поведение (взятие адреса временного объекта '& A (3)', а затем также разыменование 'c', которое является обвисшим указателем в' f'). Лучше исправить это, чтобы во избежание путаницы. – juanchopanza

+1

Взятие адреса временного является неопределенным поведением. Кроме того, оценка параметров функции - неопределенное поведение. Так что весь этот вопрос довольно ошибочен. – Rapptz

+0

Ну, это не очень полезно, возможно, создайте 3 объекта, которые печатают разные символы, поэтому мы можем различать три. –

ответ

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