2015-01-21 3 views
27

나는 API of boost::optional을 읽고 라인을 가로 질러왔다되었다에 대한 지정자 : 나는 또한 내 자신의 프로그램을 작성CONST 및, 및 && C의 멤버 함수 ++ 최근

T const& operator *() const& ; 
T&  operator *() & ; 
T&&  operator *() && ; 

const를 &, &과 같은 멤버 함수를 정의 & & (반환 형식에 대해서는 말하지 않지만 세미콜론 바로 앞에있는 지정자에 유의하십시오.) 제대로 작동하는 것 같습니다.

나는 그것이 멤버 함수를 const 선언 무엇을 의미하는지 알고 있지만, 아무도 그것이 &, & 및 & &을에서 const 선언 무엇을 의미하는지 설명 할 수있다.

+1

스택 오버플로가 시작된 후 6 년이 경과하면 어떻게 중복되지 않습니까? –

답변

20

const&은 const, const 및 lvalue 객체에만이 오버로드가 사용됨을 의미합니다.

const A a = A(); 
*a; 

& 의미는이 과부하가 비 const 객체에만 사용됨을 의미합니다.

A a; 
*a; 

&& 의미는이 과부하가 rvalue 객체에만 사용됨을 의미합니다. 당신이이 멤버 함수 REF-예선입니다이 게시물 What is "rvalue reference for *this"?

+5

도움이된다면, 나는이 한정어를 메서드의 첫 번째 인수로 "비밀리에"전달 된'this '객체에 적용하는 것으로 생각하고 싶습니다. –

+4

'const '와'&'는 그것들이'const'와 'const'가 아닌 * lvalue *에 사용될 것이라는 것을 의미합니다. '&&'는 rvalue에 대해서만 사용되며 반드시 참조가 될 필요는 없습니다. – Angew

+0

@Angew 감사합니다. – ForEveR

18

을 읽을 수있는 C++ 11 표준이 기능에 대한 자세한 내용은

*A(); 

, 그것은 C++ 11에 추가 된 기능 중 하나입니다. 함수 ref-qualifier (some details)를 지정하여 암시 적 this 객체 매개 변수가 lvalue인지 rvalue인지에 따라 비 정적 멤버 함수에 과부하를 부여 할 수 있습니다.

비 정적 멤버 함수에 대한 ref-qualifier를 지정하려면 & 또는 &&으로 함수를 한정 할 수 있습니다.

#include <iostream> 
struct myStruct { 
    void func() & { std::cout << "lvalue\n"; } 
    void func() &&{ std::cout << "rvalue\n"; } 
}; 

int main(){ 
    myStruct s; 
    s.func();   // prints "lvalue" 
    std::move(s).func(); // prints "rvalue" 
    myStruct().func(); // prints "rvalue" 
}