2017-01-25 10 views
5

私はauto関数の戻り値型を取得しようとしています。 This works:クラススコープにstatic auto機能の戻り値の型を取得:クラスの静的な自動関数の型をクラススコープ内で推測できないのはなぜですか?

auto foo(int bar) 
{ 
    return 0; 
} 

typedef std::result_of<decltype(foo)> foo_t; 

グレート、ここでは、次のステップです。 This also works

struct Foo 
{ 
    static auto foo(int bar) 
    { 
     return 0; 
    } 
}; 

typedef std::result_of<decltype(Foo::foo)> foo_t; 

しかしthis doesn't work:、クランは「関数 'と言う:

struct Foo 
{ 
    static auto foo(int bar) 
    { 
     return 0; 
    } 

    typedef std::result_of<decltype(Foo::foo)> foo_t; 
}; 

GCCは、 " '自動' の控除前の使用 '静的自動車はFoo :: fooの(int型)' エラー" と言います推測された戻り値の型を持つfooは定義される前に使用できません "。どうして?

+0

あなたは 'std :: result_of :: type'と書いたかったと思いますか? –

+0

@ O'Neil公正な機会がありますが、私は目に見える形でその仕組みが分かりません... – zneak

答えて

9

コードを記述した方法では可能ですが、foo()のクラス内定義は、クラスが完全に定義された後にのみ処理できます。

struct Foo 
{ 
    static auto foo(int bar); 

    typedef std::result_of<decltype(Foo::foo)> foo_t; 
}; 

auto Foo::foo(int bar) 
{ 
    return 0; 
} 

foo()の定義はfoo_t含むclass Fooで定義された型を、使用することを許可され、円形であろう:あなたがこれを書いたかのようにあります。したがって、class Fooの定義では、メンバー関数の定義を使用することはできません。その宣言のみです。

つまり、コードが上から下まで完全に評価されていると仮定します。そうではない。

+0

これは私が知っているすべてのものですが、「コードは完全に評価されていると仮定しています。不公正な陳述。 – zneak

関連する問題