2013-05-08 14 views
8

Nawiązując do http://en.wikipedia.org/wiki/Copy_elisionwyjątek i skopiować Konstruktor: C++

uruchomić poniżej kodu:

#include <iostream> 

struct C { 
    C() {} 
    C(const C&) { std::cout << "Hello World!\n"; } 
}; 

void f() { 
    C c; 
    throw c; // copying the named object c into the exception object. 
}   // It is unclear whether this copy may be elided. 

int main() { 
    try { 
    f(); 
    } 
    catch(C c) { // copying the exception object into the temporary in the exception declaration. 
    }    // It is also unclear whether this copy may be elided. 
} 

Wyjście mam:

[email protected] /cygdrive/d/Trial 
$ make clean 
rm -f Trial.exe Trial.o 

[email protected] /cygdrive/d/Trial 
$ make 
g++ -Wall Trial.cpp -o Trial 

[email protected] /cygdrive/d/Trial 
$ ./Trial 
Hello World! 
Hello World! 

Rozumiem, że kompilator mógłby zoptymalizowany kod z niepotrzebnym kopiowaniem, którego tu nie robi.

Ale co chcę zapytać, jak robi się two calls to the copy constructor?

catch(C c) - Ponieważ przechodzimy przez wartość, stąd tutaj wywoływany jest konstruktor kopii.

Ale na temat throw c jak wywoływany jest konstruktor kopiowania? Czy ktoś może wyjaśnić?

Odpowiedz

11
throw c;  

Tworzy obiekt tymczasowy i jest to obiekt tymczasowy, który jest tworzony. Utworzenie tymczasowego może być wykonane za pomocą konstruktora copy/move. I tak, ta kopia/ruch może zostać usunięta.


Odniesienia:
C++ 11 15,1 rzucanie wyjątek

§3:

Rzut ekspresja inicjuje tymczasowy obiekt, zwany obiekt wyjątku, którego typ określa się przez usunięcie dowolnego wierzchołka -level CV kwalifikacyjne ze statycznego typu argumentu strugi i dostosowanie typu .........

§5:

Gdy przedmiot jest wyrzucane obiekt klasy, konstruktor copy/move i destruktor muszą być dostępne, nawet jeśli operacja kopiowania/przenoszenia zostanie anulowana (12.8).

+0

Alok - Czy możesz podać przykład konstruktora ruchu? Czy to jest to samo, co operator przeniesienia zadań? Czy możesz odpowiedzieć na część "EDYTUJ" to pytanie dotyczące http://stackoverflow.com/questions/16418992/assignment-operator-for-an-object?noredirect=1#comment23544551_16418992 –

+0

@BenVoigt, Komentarze wydają się bardziej pewne niż pytanie, które prawdopodobnie pochodzi z Wikipedii. – chris

+0

W tym miejscu brakowało "inicjalizacji obiektu tymczasowego". –