2013-05-08 3 views
8

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 как называется конструктор копирования? Может кто-нибудь объяснить?

ответ

11
throw c;  

Создает временный объект, и это временный объект, который бросается. Создание временного может быть связано с конструктором copy/move. И да, эта копия/перемещение может быть отменено.


Литература:
11 15.1 С ++ Метательного исключением

§ 3:

Броски выражение инициализирует временный объект, который называется объект исключения, тип которого определяется удалением любого верхнего Уровня CV-классификаторы от статического типа операнда броска и настройки типа .........

§ 5:

Когда брошено объект является объект класса, конструктор копирования/перемещения и деструктор должны быть доступны, даже если операция копирования/перемещения завершена (12.8).

+0

Alok - Можете ли вы привести пример конструктора перемещения? Это то же самое, что и оператор Move Assignment? Можете ли вы ответить на вопрос «EDIT» - вопрос для http://stackoverflow.com/questions/16418992/assignment-operator-for-an-object?noredirect1_comment23544551_16418992 –

+0

@BenVoigt. Комментарии кажутся более уверенными, чем вопрос, который, вероятно, потому, что они происходят прямо из Википедии. – chris

+0

Там «инициализируется временный объект» - это то, чего не хватало. –

Смежные вопросы