2017-10-10 29 views
0

나는 std::move을 반환 진술서에 기입하지 말고 충고를 기울였습니다. for example. 예외적 인 경우를 제외하고는 for example입니다.std :: move in return statement

다음은 또 다른 간단한 예제입니다. std::move은 가치가있을 수 있습니다. 그러나 나는 왜 그런지, 미래의 C++에서 그 변화가있을 것인가?

#include <iostream> 

struct A 
{ 
}; 

struct C 
{ 
}; 

struct B 
{ 
    B(const A&, const C&) { std::cout << "B was copied\n"; } 
    B(A&&, C&&) { std::cout << "B was moved\n"; } 
}; 

B f() 
{ 
    A a; 
    C c; 
    //return {a, c}; // Gives "B was copied" 
    return {std::move(a), std::move(c)}; // Gives "B was moved" 
} 

int main() { 
    f(); 
    return 0; 
} 
+1

반환 된 개체를 강제로 이동하려고하지 않습니다. 사용자가 구성 중입니다. 조언과 관련이 없습니다. – StoryTeller

+5

다른 생성자는 'B'가 이동되거나 복사되는 것과 아무런 관련이 없습니다. – John

+2

당신의 코드는'return std :: move (x);'와 상당히 다릅니다. 여기서 움직이는 것은 실질적으로 반환과 관련이 없습니다. – user463035818

답변

6
return {std::move(a), std::move(c)} 

당신은 기본적으로 대신 const& 참조를 복용 버전의 B::B(A&&, C&&)를 호출하고

return B{std::move(a), std::move(c)} 

에 해당합니다. 이것은 반환 값을 이동하는 것과 아무런 관련이 없습니다.

함수의 반환 값은 B의 임시 인스턴스이며 prvalue입니다. 그것은 C++ 17, "guaranteed copy elision"에서 이익을 얻습니다. C++ 17 이전에는 RVOd이거나 대상으로 옮겨졌습니다.