const &, & и && спецификаторы для функций-членов в C ++

Недавно я читал через API boost::optional и натолкнулся на строки:

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

Я также написал свою собственную программу, которая определяет функции-члены как const &, & и && (обратите внимание, что я не говорю о типе возврата, но спецификаторы непосредственно перед полуколонами), и они, похоже, работают нормально.

Я знаю, что значит объявлять функцию-член const, но может ли кто-нибудь объяснить, что значит объявить ее const &, & и &&.

const& означает, что эта перегрузка будет использоваться только для объекта const, non-const и lvalue.

 const A a = A(); *a; 

& означает, что эта перегрузка будет использоваться только для неконстантного объекта.

 A a; *a; 

&& означает, что эта перегрузка будет использоваться только для объекта rvalue.

 *A(); 

для получения дополнительной информации об этой функции стандарта C ++ 11 вы можете прочитать это сообщение. Что такое «rvalue reference for * this»?

Он является ref-квалификатором функции-члена, это одна из функций, добавленных в C ++ 11. Можно перегрузить нестатические функции-члены на основе того, является ли неявный this параметр объекта значением lvalue или rvalue, указав функцию ref-qualifier ( некоторые детали ).

Чтобы указать ref-qualifier для нестатической функции-члена, вы можете либо квалифицировать функцию с помощью & или && .

 #include  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" } 
  • Функции с аргументами const и перегрузкой
  • Почему «extern const int n» не работает должным образом?
  • Cast vector в вектор
  • Легкое правило для чтения сложных объявлений const?
  • Путаница относительно модификации константной переменной с помощью указателей
  • Как удалить дублирование кода между аналогичными функциями const и non-const?
  • как работает перегрузка функций const и non-const?
  • «Const» означает только чтение или что-то еще?
  • C ++ typedef интерпретация константных указателей
  • Что означает «const» в конце объявления функции?
  • Измененный массив в области файлов
  • Давайте будем гением компьютера.