2012-10-16 3 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; 
    } 
}; 

これはVC++ 2012のバグですか?decltypeはr値を宣言できますか?

+1

タイプはr値またはl値ではありません。型は*型*です。 l値/ r値の分類は*式*のものです。 –

+0

参考として、gcc 4.6.3でC++ 0xフラグを付けてコンパイルします。私はあなたの両方のループが同一であると考えて、これが正しいと思います。 –

+0

B :: operator ==のiの型はconst intと推定され、VCバグのように見えます。 – Andrey

答えて

6

これはVS2012コンパイラのバグのようです。この仕様は、セクション7.1.6.2のパラグラフ4で非常に明確です。実際、与えられた例の1つは、constポインタaを介して参照する式を示しています。 decltype(a->x)doubleであり、decltype((a->x))double const &である。

だからバグです。コンパイラはiconstだと考えているので、++にはできません。

関連する問題