다음 코드는 내가 이동 생성자가 호출 될 것으로 예상 곳에 복사 생성자가 호출됩니다 : 디버그 모드로, VS11 베타에이동 생성자 대신이 복사 생성자가 호출되는 이유는 무엇입니까?
#include <cstdio>
struct Foo
{
Foo() { puts("Foo gets built!"); }
Foo(const Foo& foo) { puts("Foo gets copied!"); }
Foo(Foo&& foo) { puts("Foo gets moved!"); }
};
struct Bar { Foo foo; };
Bar Meow() { Bar bar; return bar; }
int main() { Bar bar(Meow()); }
이 인쇄 :
Foo gets built!
Foo gets copied!
Foo gets copied!
나는 확인 표준 및 Bar
은 기본 이동 생성자가 자동으로 생성되도록 모든 요구 사항을 충족하는 것으로 보입니다. 그러나 개체를 이동할 수없는 또 다른 이유가없는 한 그런 일은 발생하지 않습니다. 나는 여기에서 많은 이동 및 복사 생성자 관련 질문을 보았지만 아무도이 특정 문제를 안고 있다고 생각하지 않습니다.
여기에 무슨 일이 일어나고 있는지에 대한 정보가 있습니까? 이 표준적인 행동인가?
'return std :: move (bar); '가 변경됩니까? BTW, gcc 4.7.0은 복사 생성자를 호출합니다 (copy elision은 꺼져 있음). –
BTW, gcc 4.6.1은 copy 또는 move ctor를 호출하지 않습니다. –
g ++ 4.5.3은 "Foo가 만들어졌습니다!"라는 개체 만 생성합니다. (elion 복사), copy elision을 사용하지 않으면 객체를 두 번 복사합니다. 선회 축척이있을 때만 이동 생성자가 호출되지 않습니까? 나는 Meow()가 자격이 있는지 완전히 확신하지 못합니다. –