2012-10-16 11 views
9
// Compiled by Visual Studio 2012 

struct A 
{ 
    bool operator ==(const A& other) const 
    { 
     for (decltype(this->n) i = 0; i < n; ++i) // OK 
     {} 

     return true; 
    } 

protected: 
    size_t n; 
}; 

struct B : public A 
{ 
    bool operator ==(const B& other) const 
    { 
     for (decltype(this->n) i = 0; i < n; ++i) // error C2105: '++' needs l-value 
     {} 

     return true; 
    } 
}; 

Czy to błąd VC++ 2012?Czy decltype może zadeklarować wartość r?

+1

Typy nie są wartościami r ani l-valami; typy to * typy *. Klasyfikacja wartości l/wartość jest dla * wyrażeń *. –

+0

Dla odniesienia, kompiluje się pod gcc 4.6.3 z flagą C++ 0x. Myślę, że to prawda, biorąc pod uwagę, że obie pętle są identyczne. –

+0

Typ dla i w B :: operator == jest interpretowany jako const int, wygląda jak błąd VC. – Andrey

Odpowiedz

6

Wygląda na to, że wystąpił błąd kompilatora VS2012. Specyfikacja jest dość jasna, w sekcji 7.1.6.2, paragraf 4. Rzeczywiście, jeden z podanych przykładów pokazuje wyrażenie, które odwołuje się przez wskaźnik stałej a. decltype(a->x) plony double, a decltype((a->x)) plony double const &.

To błąd; kompilator myśli, że i jest const, a zatem nie może go.

Powiązane problemy