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ć?
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 –
@BenVoigt, Komentarze wydają się bardziej pewne niż pytanie, które prawdopodobnie pochodzi z Wikipedii. – chris
W tym miejscu brakowało "inicjalizacji obiektu tymczasowego". –