2016-03-29 15 views
0

これは簡単な質問ですが、私はしばらくの間グーグルで見つけました。 私はこの単純なコードがありますので、私はこれらの方法はX. のオブジェクトを変更する方法を確認していない。しかし、明らかに、私は何かを逃すので、私は、それをコンパイルすることを期待const修飾子が破棄された理由を理解していない

class X { 
    public: 
     X() : x_(42) {}; 
     virtual const long long f() const { 
      return do_f(); 
     } 
    protected: 
     virtual const long long do_f() const { 
      return x_; 
     } 
     long long x_; 
}; 

auto main() -> int { 
    X x; 
    x.f(); 
} 

を:

[email protected] /tmp $ g++ --std=c++14 -Werror=ignored-qualifiers 1.cpp   
1.cpp:6:37: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers] 
     virtual const long long f() const { 
            ^
1.cpp:10:40: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers] 
     virtual const long long do_f() const { 
             ^
cc1plus: some warnings being treated as errors 
[email protected] /tmp $ 

答えて

4

取得しているconstエラーは、関数の修飾子(最後のconst)ではなく、戻り型の修飾子(最初はconst)のconstに関連しています。

これらは整数型であり、参照ではなく値によって返されるため、const修飾子は必要ありません。これは、によって返されるであるすべてのタイプ(組み込みまたはユーザ定義)に適用されます。

次のようにだからあなたの関数の定義は次のようになります。

virtual long long f() const; 
    virtual long long do_f() const; 
+0

「彼らは整数型であるので、それらは値ではなく、参照することによって返されるので、彼らはconstqualifierを必要としません。」私は同意しません - 戻り値の型は違いはありません。参照によって整数を返すことができます。そして、 'const'は完全な意味を持ちます。 –

+0

@LuchianGrigore大丈夫、文章が書き換えられました。 – LoPiTaL

+0

この回答は間違った印象を簡単に伝えることができます。私はそれがすべての合理的な解釈の下で間違っていないのでdownvotingではないが、私は確かにどちらかをupvotingしていない。 –

関連する問題