Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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"
}