Const &, & и && спецификаторы для функций-членов в С++
Недавно я читал API boost::optional
и наткнулся на строки:
T const& operator *() const& ;
T& operator *() & ;
T&& operator *() && ;
Я также написал свою собственную программу, которая определяет функции-члены как const &, и && (Обратите внимание, что я не говорю о типе возврата, но спецификаторы перед полуколонами), и они, похоже, работают нормально.
Я знаю, что значит объявлять функцию-член const, но может ли кто-нибудь объяснить, что значит объявить ее const &, и & & &.
Ответы
Ответ 1
const&
означает, что эта перегрузка будет использоваться только для объектов const, non-const и lvalue.
const A a = A();
*a;
&
означает, что эта перегрузка будет использоваться только для неконстантного объекта.
A a;
*a;
&&
означает, что эта перегрузка будет использоваться только для объекта rvalue.
*A();
для получения дополнительной информации об этой функции стандарта С++ 11 вы можете прочитать этот пост Что такое "rvalue reference для * this" ?
Ответ 2
Это ref-qualifiers для функции-члена, это одна из функций, добавленных в С++ 11. Можно перегрузить нестатические функции-члены на основе того, является ли неявный параметр объекта this
значением lvalue или rvalue, указав функцию ref-qualifier (some подробности).
Чтобы указать 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"
}