2015-03-15 15 views
8

znalazłem trochę kodu:Kiedy należy użyć const i do tego?

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

kompiluje i działa.

Zastanawiam się, jakie są zalety (lub wady) posiadania odniesienia (&) do tego w operatorze ==.

+0

To rzeczywiście kompiluje! Mind dmuchane>.

+0

@NeilKirk Dlaczego by nie? –

+0

@ T.C. Nigdy wcześniej nie widziałem tej składni. –

Odpowiedz

4

Jako T.C. zauważyłem w komentarzach, że powodem tego NIE jest "akceptowanie tylko lwartości". const odwołania wiążą się do wartości r po prostu dobrze.

Powodem jest to, że funkcje mogą być przeciążane na kategorię wartości parametru obiektu niejawnego tylko wtedy, gdy WSZYSTKIE przeciążenia określają kategorię wartości. Oznacza to, że po dodaniu przeciążenia z &&, które dopasowuje tylko wartości r, nie będzie kompilacji, chyba że dodasz & do istniejącego przeciążenia.

13,1, jest tu sformułowanie zasady:

deklaracje funkcji państwa o tej samej nazwie i tym samym parametr typu liście jak również deklaracji szablon funkcji członkowskich o tej samej nazwie, ta sama lista parametrów z parametrami i ta sama lista parametrów szablonu szablonu nie może być przeciążona, jeśli którykolwiek z nich, ale nie wszystkie, ma reflikat kwalifikacyjny .

i daje przykład

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

Heh, napisałem '* this' ... yes,' * this' jest zawsze lwartością. –

+0

@ T.C .: Doh! Twój komentarz do edycji ma wtedy sens. –

+0

głosować w górę. Łączenie T.C. komentarz i odpowiedź, będzie to idealna odpowiedź. –

Powiązane problemy