(G ++에서) 컴파일하고 다음 코드를 실행하면 "Foo :: Foo (int)"가 인쇄됩니다. 그러나 복사 생성자와 할당 연산자를 비공개로 만들면 다음 오류로 컴파일되지 않습니다. "오류 : 'Foo :: Foo (const Foo &)'가 비공개입니다. 런타임시 표준 생성자 만 호출하는 경우 복사 생성자가 필요한 이유는 무엇입니까?컴파일러 액세스 규칙
#include <iostream>
using namespace std;
struct Foo {
Foo(int x) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
}
Foo& operator=(const Foo& f) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
};
int main() {
Foo f = Foo(3);
}
복사 생성자를 사용한다고 주장하면 출력에서 왜 보이지 않습니까? 원래의 포스터는 명확하게 :: Foo (int) 만 호출되었음을 명시했습니다. – KIV
@ Neil하지만 복사 생성자가 명확하게 뭔가를하므로 컴파일러가이를 최적화하지 못하는 것 같습니다. –
@Matthew : 아니요. 표준을 통해 명시 적으로 호출을 최적화 할 수 있으므로 컴파일러는 어떤 것도 신경 쓰지 않습니다. 부작용. 그 소금 가치가있는 현대 컴파일러 *는이 호출을 최적화합니다. 다른 한편, 표준은 통화가 여전히 가능해야한다는 것을 명확하게 명시합니다. 따라서 닐의 설명은 옳고 그 요점이다. –