복사 제거는 특정 상황에서 추가(잠재적으로 비용이 많이 드는) 사본을 방지하기 위해 대부분의 컴파일러에서 구현하는 최적화입니다. 따라서 사용되지 않거나 부작용이 없는 개체를 생성하는 코드가 있는 경우
예
struct MyStruct {
MyStruct() {}
MyStruct(const MyStruct&) {
std::cout << "Copied.\n";
}
};
MyStruct f() {
return MyStruct();
}
int main() {
std::cout << "Main\n";
MyStruct obj = f();
} 출력
컴파일러 및 설정에 따라 다음과 같은 출력을 얻을 수 있습니다. -
Main Main Copied Copied Main Copied
즉, 생성할 수 있는 개체가 예상보다 적으므로 특정 수의 생성자와 소멸자를 호출할 수 없습니다. 복사/이동 생성자 또는 소멸자 내부에 중요한 논리가 있어서는 안 됩니다. 호출되는 것에 의존할 수 없기 때문입니다.