2015-03-15 5 views
8

Я нашел такой код:Когда я должен использовать const & для этого?

class foo{ 
    int a; 
public: 
    foo(int v) : a{v} {} 
    bool operator==(const foo& rhs) const&{ 
     return (rhs.a == a); 
    } 
}; 

Это компилируется и работает.

Мне было интересно, какие преимущества (или недостатки) имеют ссылка (&) на это в операторе ==.

+0

Это на самом деле компилирует! Mind blown>.

+0

@NeilKirk Почему бы и нет? –

+0

@ T.C. Я никогда не видел этот синтаксис раньше. –

ответ

4

As T.C. указывал в комментариях, поэтому для этого НЕ «принимать только lvalues». const ссылки привязываются к rvalues ​​просто отлично.

Причина в том, что функции могут быть перегружены в категорию значений неявного параметра объекта, только если ALL overloads задает категорию значений. То есть, когда вы добавляете перегрузку с &&, которая соответствует только rvalues, она не будет компилироваться, если вы не добавите & к существующей перегрузке.

В 13.1, здесь формулировка правила:

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

и дает пример

class Y 
{ 
    void h() &; 
    void h() const &;  // OK 
    void h() &&;    // OK, all declarations have a ref-qualifier 
    void i() &; 
    void i() const;   // ill-formed, prior declaration of i 
           // has a ref-qualifier 
}; 
+0

Хех, я написал '* this' ... да,' * это всегда lvalue. –

+0

@ T.C .: Doh! Тогда ваш комментарий к редактированию имеет смысл. –

+0

голосование вверх. Объединение T.C. комментарий и ваш ответ, это будет прекрасный ответ. –

Смежные вопросы