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 и const ссылку в функции args
  • int vs const int &
  • Доступ к элементу C ++ const
  • В чем разница между #define и const?
  • В чем разница между константой и readonly?
  • Измененный массив в области файлов
  • В чем разница между const int *, const int * const и int const *?
  • Почему элементы const должны быть инициализированы в инициализаторе конструктора, а не в его теле?
  • Значение 'const' является последним в объявлении функции classа?
  • Путаница относительно модификации константной переменной с помощью указателей
  • Почему не является законным преобразовывать «указатель на указатель на не-const» в «указатель на указатель на const»,
  • Давайте будем гением компьютера.