2016-08-08 15 views
20

たちはtypedef経由constメンバ関数を宣言したいと仮定します。のconstメンバ関数とのtypedef、C++

typedef int FC() const; 
typedef int F(); 

struct A 
{ 
    FC fc;   // fine, we have 'int fc() const' 
    const F fc; // not fine, 'const' is ignored, so we have 'int fc()' 
}; 

constので、プログラムが正常にコンパイル無視されます。機能のためになぜconstが無視されるのですか?このようにしてconstポインタを形成できるので、私が考えることができるのは「Cの遺産」だけです。スタンダードはそれについて何か言いますか?

+0

'int()const'はほとんど半分の型です。メンバ関数を持つためにクラスにのみ適用されるためです。 – Jarod42

+0

Cにはメンバー関数がないので、 "C遺産"にすることはできません。 – Jarod42

+0

はい、でもCでは次のようなことがあります。 typedef int F(); const F f; でも、 'int f()const'は構文上正しくないかもしれません。 – igntec

答えて

19

C++ 14スタンダード[dcl.fct]pt。 7:

関数宣言におけるCV-修飾子-配列の効果は、関数型の上部 にCV-資格を追加すると同じではありません。後者の場合、cv修飾子は無視されます。 [注意: のcv-qualifier-seqを持つ関数型は、cv修飾型ではありません。 cv修飾された関数型はありません。 - エンドノート]

例:

typedef void F(); 

struct S { 
    const F f; // OK: equivalent to: void f(); 
}; 

ので、これは正しい動作です。

2

この変更はCWG 295によって行われました。本質的なプログラミングを容易にするためです。考えてみましょう:

template<class F> 
void meow(const F& f) { f(); } 
void purr(); 

meow(purr); 

仕事にこれを可能にする追加のconstを無視します。

関連する問題