C++ Ссылаясь на http://en.wikipedia.org/wiki/Copy_elisionИсключение и Конструктор копирования:
я запускаю ниже код:
#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.
}
Выход я получил:
[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!
Я понимаю, что компилятор может быть оптимизирован код с ненужным копированием, чего он здесь не делает.
Но что я хочу спросить, как производится two calls to the copy constructor
?
catch(C c)
- Поскольку мы проходим по значению, следовательно, здесь вызывается экземпляр копии.
Но в throw c
как называется конструктор копирования? Может кто-нибудь объяснить?
Alok - Можете ли вы привести пример конструктора перемещения? Это то же самое, что и оператор Move Assignment? Можете ли вы ответить на вопрос «EDIT» - вопрос для http://stackoverflow.com/questions/16418992/assignment-operator-for-an-object?noredirect1_comment23544551_16418992 –
@BenVoigt. Комментарии кажутся более уверенными, чем вопрос, который, вероятно, потому, что они происходят прямо из Википедии. – chris
Там «инициализируется временный объект» - это то, чего не хватало. –