멤버 함수에 대한 Const 참조 한정자
-
21-12-2019 - |
문제
나는 거기에 있는 답변에서 보았습니다.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를 허용합니다.