2012-04-18 7 views
8

다음 코드는 내가 이동 생성자가 호출 될 것으로 예상 곳에 복사 생성자가 호출됩니다 : 디버그 모드로, 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은 기본 이동 생성자가 자동으로 생성되도록 모든 요구 사항을 충족하는 것으로 보입니다. 그러나 개체를 이동할 수없는 또 다른 이유가없는 한 그런 일은 발생하지 않습니다. 나는 여기에서 많은 이동 및 복사 생성자 관련 질문을 보았지만 아무도이 특정 문제를 안고 있다고 생각하지 않습니다.

여기에 무슨 일이 일어나고 있는지에 대한 정보가 있습니까? 이 표준적인 행동인가?

+0

'return std :: move (bar); '가 변경됩니까? BTW, gcc 4.7.0은 복사 생성자를 호출합니다 (copy elision은 꺼져 있음). –

+0

BTW, gcc 4.6.1은 copy 또는 move ctor를 호출하지 않습니다. –

+0

g ++ 4.5.3은 "Foo가 만들어졌습니다!"라는 개체 만 생성합니다. (elion 복사), copy elision을 사용하지 않으면 객체를 두 번 복사합니다. 선회 축척이있을 때만 이동 생성자가 호출되지 않습니까? 나는 Meow()가 자격이 있는지 완전히 확신하지 못합니다. –

답변

8

불행히도 VS11은 기본 이동 생성자를 제공하지 않습니다. 주의 섹션에 Move Semantics 참조 - 인용 :

기본 복사 생성자와 달리, 컴파일러가 기본 이동 생성자를 제공하지 않습니다.

+0

좋은 캐치, 고마워요! 그것은 표준에 의해 어떻게 든 허용됩니까? 그렇지 않다면 Microsoft Connect에서 잘 알고 있어야 함에도 불구하고 Microsoft Connect에서 버그를 열 것입니다. – Trillian

+0

MS는 새로운 C++ 11 기능을 모두 아직 구현하지 않았습니다. http://msdn.microsoft.com/ko-kr/library/hh409293%28v=vs.110%29.aspx 및 http://blogs.msdn.com/b/vcblog/archive/2011/에서 자세한 정보가 있습니다. 09/12/10209291.aspx – Fraser

+0

젠장, 우리도 최종 VS11 릴리스의 기본 이동 생성자 생성을 얻지 못하고 있습니다. / – Trillian