다음 함수를 고려하십시오.값으로 반환 될 때 값 매개 변수가 암시 적으로 이동됩니까?
Foo foo(Foo x)
{
return x;
}
return x
이 복사 생성자 또는 이동 생성자를 호출합니까?
조사할만한 이동 가능하지만 복사 할 수없는 간단한 Foo
클래스를 작성했습니다.
struct Foo
{
Foo() = default;
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
};
값 매개 변수를 값으로 반환 할 때 이동 생성자가 호출 된 경우 all 괜찮을거야. 그러나 현재 g ++ 컴파일러는 return x
에 대해 다음과 같은 오류 메시지를 표시합니다.
error: deleted function 'Foo::Foo(const Foo&)'
return x
을 return std::move(x)
로 바꾸면 모든 것이 정상입니다. 이것으로부터 필자는 원하는 경우 값 매개 변수에서의 이동이 명시 적으로 수행되어야한다고 결론을 내립니다. g ++의 행동이 부합 하는가?
Upvoted. 이것은 초안에 대한 상대적으로 늦은 변화로 어디서나 구현되지 않은 이유를 설명합니다. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1148 –