문제

나는 거기에 있는 답변에서 보았습니다.rvalue 참조로 반환하는 것이 더 효율적인가요?

멤버 함수 정의:

Beta_ab const& getAB() const& { return ab; }

나는 ~에 대해 잘 알고 있다 이력서 한정자 (const) 멤버 함수에는 있지만 const&.

마지막은 무엇입니까? const& 평균?

도움이 되었습니까?

해결책

그만큼 &참조 한정자.Ref 한정자는 C++11의 새로운 기능이며 아직 모든 컴파일러에서 지원되지 않으므로 현재는 자주 표시되지 않습니다.이 함수는 lvalue에서만 호출할 수 있음을 지정합니다(rvalue에서는 호출할 수 없음).

#include <iostream>

class kitten
{
private:
    int mood = 0;

public:
    void pet() &
    {
        mood += 1;
    }
};

int main()
{
    kitten cat{};
    cat.pet(); // ok

    kitten{}.pet(); // not ok: cannot pet a temporary kitten
}

이력서 한정자와 결합됨 const, 이는 lvalue에서만 이 멤버 함수를 호출할 수 있으며 이는 const일 수 있음을 의미합니다.

다른 팁

우리는 이 코드에서 그것을 알고 있습니다...

Beta_ab const& getAB() const { return ab; }
                       ^^^^^

강조 표시된 const 멤버 함수가 다음과 같은 경우에 호출될 수 있음을 의미합니다. const 물체.멤버 함수는 항상 비 멤버 함수에서 호출될 수 있습니다.const 함수의 cv 자격과 관계없이 객체입니다.

그래서 이 코드에서는...

Beta_ab const& getAB() const & { return ab; }
                             ^

우리는 강조된 부분이 & 또한 이 멤버 함수를 호출할 수 있는 객체의 종류에 대해서도 설명합니다.우리 말이 맞을 것이다.C++11에서는 멤버 함수가 lvalue에서만 호출될 수 있음을 의미합니다.

Beta_ab const& getAB() const& { return ab; }
Beta_ab &&     getAB() &&     { return ab; }

위의 예에서 첫 번째 오버로드는 lvalue에서 호출되고 두 번째 오버로드는 lvalue가 아닌 값에서 호출됩니다.const rvalue.일반 함수 매개변수에 한정자를 적용한 다음의 보다 친숙한 예와 유사합니다.

void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB &&     _ab) { ab = std::move(_ab); }

일반 매개변수의 경우 약간 다르게 작동하지만 이 예에서와 같이 두 번째 오버로드가 제거되면 첫 번째 오버로드가 rvalue를 허용합니다.

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