2017-02-24 9 views
7
#include <vector> 

using namespace std; 

struct A 
{ 
    A(const vector<int>&) {} 
    A(vector<int>&&) {} 
}; 

A f() 
{ 
    vector<int> coll; 
    return A{ coll }; // Which constructor of A will be called as per C++11? 
} 

int main() 
{ 
    f(); 
} 

collxvaluereturn A{ coll };?C++ 11은 return 문에서 지역 변수가 복사되지 않고 이동된다는 것을 보장합니까?

f이 반환 될 때 C++ 11 보증 A(vector<int>&&)이 호출됩니까?

+0

예에서 'A {coll}'는 호출자 컨텍스트에서 생성되고 A (const vector &) 생성자를 사용합니다. – Oliv

답변

11

C++ 11은 coll을에서 이동할 수 없습니다. return <identifier>을 수행하면 return 문에서 암시 적 이동 만 허용됩니다. 여기서 <identifier>은 로컬 변수의 이름입니다. 그보다 더 복잡한 표현은 암묵적으로 움직이지 않을 것입니다.

그보다 복잡한 표현은 이 아니며은 어떤 형태의 elision도 거치지 않습니다.

+4

+1; ''의 유형이 return'd 유형과 일치하지 않는 경우, 어디로 이동했는지 알 수 있습니다. 이것은 결함 보고서 또는 C++ 14의 변경에서 수정되었습니다. 그러나 레거시 컴파일러를 사용하고 있거나 위험을 사용하고 있다면, 타입이 정확히 일치하지 않을 때 '이동'이 현명 할 수 있습니다 (비용이 들지 않습니다). 한편 유형이 정확히 일치하면 '이동'으로 인해 이탈이 차단됩니다. 비교적 오래된 컴파일러를 사용하는 경우에만 문제가됩니다. – Yakk

+0

@vsoftco : 오, * 표현 *은 prvalue이며, 그 것처럼 동작합니다. 그러나'coll'는'A'로 옮겨지지 않을 것입니다. 그리고 그것은 질문이 물었던 것입니다. –

+0

@NicolBolas 감사합니다! 예, 제가 의견을 쓴 후 깨달았습니다. 처음에 나는'A'가 움직이는 ctor를 가지고 있고 그 질문은'A' 객체 자체에 관한 것이라고 생각했습니다. – vsoftco