Line Line::operator =(Line ln) {
cout << "Assignment operator\n";
Line temp;
temp.ptr = new int;
*temp.ptr = *(ln.ptr);
return temp;
}
上記のコードでは、次のステートメントが実行されたときにコピーコンストラクターは呼び出されません。
return temp;
戻り値は値によるものなので、コピーコンストラクターが呼び出されないのはなぜですか?
ありがとう
上記の設定では、コンパイラがコピーコンストラクタを省略し、代わりtemp
に、戻り値が期待される場所に一時を直接構築する可能性が非常に高くなります。コピーコンストラクタに副作用がある場合でも、コピーの省略は明示的に許可されます。ただし、コピーが省略された場合でも、コピーまたは移動コンストラクターはアクセス可能である必要があります。つまり、コピー省略の可能性によって、対応するコンストラクターのルールが緩和されてアクセス可能になることはありません。
コピーコンストラクターを絶対に呼び出したいと思う場合は、たとえば、結果を恒等関数に渡すことで、コピーの構築を強制できます。
template <typename T>
T const& identity(T const& object) {
return object;
}
// ...
return identity(temp);
ただし、通常は、コピーコンストラクターを削除する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加