문제

하나의 멋진 새로운 기능의 다가오는 C++standard C++0x,은"번씩만 참조가 있습니다." 번씩만 reference 유사한 lvalue(정상),참고할 수 있다는 점을 제외하고 준수할 일시적인 가치(일반적으로 임시 수밖에 없을 const 참조):

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

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

그래서 그들은 왜 발명하는 새로운 유형의 제거 제한에 대한 참조를 할 수밖에 없 임시 개체?

도움이 되었습니까?

해결책

그것은 무의미 한 것.당신이 변하는 것에서 기능,그리고 변경을 잃게 될 것이기 때문에 즉시는 일이었고 실제로는 일시적입니다.

는 이유에 대한 새로운 형식에서 비롯될 필요가 무엇을 결정할 수 있는 실제로 이번씩만하고 무지 않습니다.만 당신은 실제로 사용할 수 있는 그들을 위한 멋진 일들이 사용됩니다.

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));
}

지금,당신은 몇몇이 있는 경우번씩만 전달하 toupper,이번씩만 수 있습을 직접 수정할 것을 알고 있기 때문에 우리는 임시은 버리는 것은 어쨌든,그래서 우리는 할 수 있을뿐만 아니라 단지 그것을 변경하고를 복사할 필요가 없습니다.또한,동일한 관찰에 사용되는 것 라는 이동 생성자 및 이동 할당.오른쪽에 복사되지 않습,그러나 그것의 일은 단지 도난 곳으로 이동 *this.

당신이었다고 말하는 반환할 수 있는 바인딩을 비 const lvalue 참조는,당신은 방법은 없는지를 참조하는 lvalue(라는 개체)또는번씩만(임시)습니다.


그것은 아마 더 작은 알고 있지만,유용한 어쨌든,당신을 넣을 수 있습 lvalue 또는번씩만 심판-예선전에 회원 기능입니다.여기에 예를 들어,자연적으로 확장하는 기존의 의미번씩만 참조하면 암시적 개체 매개변수:

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

지금할 수 없습니다 더 이상 말

string() = "hello";

는 혼동하지 않은 정말 감각을 만드는 대부분의 시간입니다.무엇 & 위 않는 할당 운영자에만 호출할 수 있습에 lvalues.동일한 수행할 수 있습에 대한 반환,에 의해 퍼팅 &&.

다른 팁

새로운 종류의 참조를 추가하면 메소드의 두 가지 과부하를 쓸 수 있습니다.

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

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

새로운 종류의 참조를 받아들이는 버전은 다른 곳에서는 사용되지 않기 때문에 수신하는 변수를 수정할 수 있습니다. 그래서 그것은 그것의 내용을 "도둑질"할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top