2013-05-27 5 views
9

を考えてみましょう宣言されfollowing codedecltype:エラー「参照」メンバーの前に使用

struct test {  
    auto func() -> decltype(data) {} // ERROR 

    int data; 
}; 

int main() { 
    test t; 
    t.func(); 
} 

それは、次のエラー与える:私は上記のdataを配置する場合は、しかし、

main.cpp:2:29: error: 'data' was not declared in this scope 
    auto func() -> decltype(data) {} 

func()、エラーなし(live code):

struct test {  
    int data; 

    auto func() -> decltype(data) {} 
}; 

... 

そして、私の質問は、なぜdecltypeは、(decltypeが定義ではなくメソッド宣言で使用されている)メンバーの後ろに宣言されていないと考えているのですか?将来の言語標準の反復でこの動作に変更があるかどうかを知りたいと思っています。


私は異なる動作をするdecltypeを期待していたので、私はこれを求めていることに注意してください。私のコーディング規約では、クラスデータメンバをクラス関数の下に配置します。確かに、この異なる振る舞いは、私がどのようにクラスメンバーを編成するかに影響します。あなたのコーディング規則を維持するための回避策を提供できるなら、非常に感謝します。

+0

申し訳ありません - Cから継承されたC++の性質を、 –

+0

これは 'decltype'だけではなく、単純な' typedef'でも[同じ動作](http://coliru.stacked-crooked.com/view?id=8f959fbd70b0b7d44c21ff0d71967fd5-6f7ec8a47f20223a17b26973b6e13527)を示しています。 'typedef'をメンバ関数定義の上に移動すると、明らかに問題が解決されます。 – Praetorian

+0

@Praetorianそれは固有の問題です...あまりにも悪いです。 –

答えて

7

末尾の戻り値の型はありませんメンバ関数定義、とは違って、それの後に宣言されたデータメンバやメンバ関数へのアクセスを持っていないメンバ関数宣言、の一部です。私はC++ 14でのこの動作の変化を認識していません。

C++ 11標準、非修飾名のルックアップの3.4.1-7を参照してください:

A name used in the definition of a class X outside of a member function body or nested class definition shall be declared in one of the following ways:

  • before its use in class X or be a member of a base class of X (10.2), or...

(強調鉱山)

+0

3.3.7/1のクラスメンバのスコープの定義も参照してください。 – aschepler

関連する問題