2009-05-09 11 views
20

다가올 C++ 표준의 멋진 새로운 기능 중 하나 인 C++ 0x는 "rvalue references"입니다. 그것은 (일반적으로, 임시 만 const 참조에 바인딩 할 수 있습니다) 임시 값에 바인딩 할 수 제외하고를 rvalue 참조가, 좌변 (일반) 참조 유사하다 : 그래서C++ 0x rvalue 참조가 기본값이 아닌 이유는 무엇입니까?

void FunctionWithLValueRef(int& a) {...} 
void FunctionWithRValueRef(int&& a) {...} 

int main() { 
    FunctionWithLValueRef(5); // error, 5 is a temporary 
    FunctionWithRValueRef(5); // okay 
} 

, 왜했다 일반 참조에 대한 제한을 제거하여 임시 테이블에 바인딩되도록하는 대신 전체적으로 새로운 유형을 고안해야합니다.

+3

나는 이것이 왜 3 표를 얻었는지 궁금하다. 투표를하지 않고 질문을 한 번도 즐겨 보지 못했다고 생각하지 않습니다 (투표에서 제외되거나 잠겨 있지 않는 한). – Zifre

+3

나는 누군가가 어떤 식 으로든 생각하는 이유를 궁금해하며, 다른 사람들은 그가하는 일과 똑같이 할 것이라고 기대합니다. – user534498

+1

나는 "좋고 upvote를주는"것이 왜 불합리한 기대인지 궁금하다. –

답변

43

그것은 무의미한 것입니다. 함수의 내용을 변경하면 변경 내용은 실제로 일시적이기 때문에 즉시 잃게됩니다.

새로운 유형의 이유는 실제로 rvalue와 무엇이 아닌지를 결정할 수 있어야하기 때문입니다. 그래야만 실제로 사용 된 멋진 것들을 사용할 수 있습니다. '당신은 몇 가지를 rvalue를하고 TOUPPER을 전달하면 우리가 임시 어쨌든 던져 - 멀리 것입니다 알고 있기 때문에 지금

string toupper(string && s) { // for nonconst rvalues 
    for(char &c : s) make_uppercase(c); 
    return move(s); // move s into a returned string object 
} 

string toupper(string const& s) { // for the rest 
    // calls the rvalue reference version, by passing 
    // an rvalue copy. 
    return toupper(string(s)); 
} 

는의를 rvalue 직접 수정할 수 있습니다, 그래서 우리는 그것을하고 돈을 변경할 단지 aswell 수 있습니다 그것을 복사 할 필요가 없다. 또한, 동일한 관찰이 이동 생성자 및 이동 할당이라고 불리는 것에 대해 사용됩니다. 오른편은 복사되지 않지만 그 물건은 도난 당했고 *this으로 옮겨졌습니다.

rvalues가 const가 아닌 왼쪽 값 참조에 바인딩 될 수 있다고 말하면, 마지막으로 왼쪽 값 (명명 된 객체) 또는 오른쪽 값 (임시)을 참조하는지 여부를 파악할 방법이 없습니다.


그것은 아마 좀 알고하지만 어쨌든 유용합니다, 당신은 멤버 함수에 좌변 또는를 rvalue 심판-한정자를 넣을 수 있습니다. 여기에 자연스럽게 내장 객체 매개 변수를 rvalue 참조 기존의 의미를 확장하는 예이다 : 지금

struct string { 
    string& operator=(string const& other) & { /* ... */ } 
}; 

, 당신은 더 이상 말할 수없는 혼란과 만드는 정말 아니다

string() = "hello"; 

대부분의 시간을 감지합니다. 위의 &은 할당 연산자가 lvalues에서만 호출 될 수 있다고 말합니다. 동일한 값은 &&을 넣음으로써 결정할 수 있습니다.

+1

+1 lvalues ​​/ rvalues ​​회원 전용 통화에 대한 마지막 부분에 대해 감사드립니다.나는 C++ 0x에 관해 많은 것을 읽었지만 그 것에 대해서는 아무 것도 보지 못했습니다 (나는 마지막 초안에 있지만 모든 것을 읽지는 않았다). 이 기능에 대한 몇 가지 문서를 가르쳐 주시겠습니까? – Klaim

+0

다음은 멋진 개요입니다. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1821.htm. 작업 보고서에서 8.3.5, 9.3.1 및 13.3.1을 참조하십시오. –

+0

이 답변을 주셔서 감사합니다. 난 그냥 rvalue 참조를 잘 이해하지 못했습니다. 이것은 제가 생각했던 것보다 훨씬 더 의미가 있습니다. – Zifre

12

참조의 새로운 종류를 추가하는 방법의 두 가지 오버로드를 기록 할 수 있기 때문에 :

void CopyFrom(MyClass &&c) 
{ 
    dataMember.swap(c); 
} 

void CopyFrom(const MyClass &c) 
{ 
    dataMember.copyTheHardWay(c); 
} 

는 수신 변수를 수정할 수 있습니다 참조의 새로운 종류를 수용 버전을, 그 변수 ISN 때문에 다른 곳에서는 사용하지 않을 것입니다. 그래서 그것의 내용을 "훔칠"수 있습니다.

이것이이 기능이 추가 된 전체 이유입니다. 한 가지 유형의 참조를 유지하면 원하는 목표를 달성하지 못합니다.