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.
}
私が得た出力:
Gaurav@Gaurav-PC /cygdrive/d/Trial
$ make clean
rm -f Trial.exe Trial.o
Gaurav@Gaurav-PC /cygdrive/d/Trial
$ make
g++ -Wall Trial.cpp -o Trial
Gaurav@Gaurav-PC /cygdrive/d/Trial
$ ./Trial
Hello World!
Hello World!
コンパイラが不要なコピーを使用してコードを最適化した可能性があることは理解していますが、ここでは行っていません。
しかし、私が聞きたいのは、どのようtwo calls to the copy constructor
に作られているのですか?
catch(C c)
- 値渡しなので、ここでコピー コンストラクターが呼び出されます。
しかし、throw c
コピー コンストラクターはどのように呼び出されるのでしょうか。誰か説明できますか?