2017-12-11 40 views
1
#include <vector> 
using namespace std; 

struct TempData { 
    vector<int> data; 
    TempData() { 
     for(int i = 0; i < 100; i++) data.push_back(i); 
    } 
    // vector<int> GetData() { // function 1 
    // return move(data); 
    // } 
    vector<int>&& GetData() { // function 2 
     return move(data); 
    } 
}; 

int main() { 
    vector<int> v; 
    { 
     TempData td; 
     v = td.GetData(); 
    } 
} 

function 1function 2의 차이점은 무엇입니까?멤버 함수 반환 값 멤버 변수의 rvalue 참조

function 1vectormove(data)으로 구성한 다음 vectorv으로 지정 하시겠습니까?

더 이상 자세한 내용은 차이가 가능성이없는 당신의 작은 테스트 케이스에서 ...

+0

한 함수는 새 벡터를 반환하고 다른 함수는 반환하지 않습니다. –

+0

참조 한정자에 대한 오버로드를 고려해야합니다. https://stackoverflow.com/questions/21052377/whats-a-use-case-for-overloading-member-functions-on-reference-qualifiers를 참조하십시오. –

+0

이 작업을 수행해야하는 경우, 그렇다면 당신은 그것을 돌려 줄 필요가 없습니다. – keith

답변

2

를 추가 할 수 있습니다. 여분의 임시 객체는 거의 제거 될 것입니다. 그리고 메인의 v은 멤버 변수의 내용을 보유합니다.

그러나 일반적인 경우에

:

버전 1은 확실히는 일부 지정되지 않은 "빈"상태에 멤버 data을 떠날 것이다. 함수 반환 값이 삭제 된 경우에도 마찬가지입니다.

버전 2 구성원을 지정되지 않은 빈 상태로 두거나 그렇지 않을 수도 있습니다. 예를 들어 함수가 호출되고 반환 값이 무시되면 멤버는 변경되지 않습니다. 이것이 std::move 그 자체로 아무것도 움직이지 않는다고 말할 수있는 이유입니다.