(나는 -O2
와 GCC를 사용하고 있습니다.)복사 생성자가 여기에서 생략 된 이유는 무엇입니까?
의 bar
의 사본 필드의 값을 액세스하는 어떤 부작용이 없기 때문에 이것은, 복사 생성자를 생략하다 할 수있는 직접적인 기회처럼 보인다 foo
; 복사 생성자 은 meep meep!
이라는 출력을 얻었 기 때문에이라는 이름으로 호출됩니다. a) 귀하는 수정하지 않고 필드 값을 복사하는 보장은 없습니다, 당신의 복사 생성자는 부작용이 있기 때문에 b)는() 메시지를 출력하기 때문에
#include <iostream>
struct foo {
foo(): a(5) { }
foo(const foo& f): a(f.a) { std::cout << "meep meep!\n"; }
int a;
};
struct bar {
foo F() const { return f; }
foo f;
};
int main()
{
bar b;
int a = b.F().a;
return 0;
}
원본 인스턴스의 필드 값을 단순히 반환하는 대신 복사 생성자가 호출되는 이유는 무엇입니까? –
그것이 누락되지 않았 음을 어떻게 알 수 있습니까? 그리고 왜 그랬어야한다고 생각하니? 이 두 가지 쿼리와 관련하여 질문을 수정하십시오. –
@Michael, 맞습니다. –