2012-09-14 4 views
30

が、私はこのような表現を参照してください。「 - >」私は何を知らない関数宣言の後に " - >"とは何ですか? 1つのシステムヘッダファイルで

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type> 
{...} 

、それは式またはラムダ式をポインタでない手段を、誰も私を助けることができますか?

+4

ちなみに、グーグルリングの場合、用語は「末尾の戻り値の型」です。 – chris

答えて

47

これはC++ 11の新しい関数宣言構文であり、 "後続の戻り型"と呼ばれています。関数宣言の末尾にある->は、関数の戻り値の型が次のものであることを意味します。これは、通常は期待する実際の戻り値型の代わりにautoキーワードが使用されている場合にのみ使用できます。例えば

、これら2つの宣言は互換性があります:

int foo(); 
auto foo() -> int; 

あなたの好みに応じて、戻り値の型は、複雑な/極端に長い場合は特に、古い宣言構文よりも、それはきれいに見つけることがあります。

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param); 
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>; 

ただし、関数の戻り値の型が引数によって異なる可能性がある場合は、テンプレートで必要になることがあります。

あなたはテンプレート関数は、変数を追加したいと言う:素晴らしいことだが、あなたは、同じ型の変数を追加することができます

template<typename T> 
T add(const T& x, const T& y) 
{ 
    return x + y; 
} 

。任意のタイプの変数(たとえばadd((int)1, (double)2))を追加できるようにしたいとします。

template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x + y; 
} 

問題は、あなたがx + yの結果の型がどうなるか事前に伝えることができないということです。テンプレートが存在するので、それらは非整数型であってもよい。 (add(std::string("x"), "y")を実行したいのですか?)

Decltypeは、新しい関数宣言構文とともにこの問題を解決できます。

template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x + y) 
{ 
    return x + y; 
} 

Decltype "式"の型を返す。 decltype(x + y)が動作するようにxyが宣言されている必要があるため、新しい構文が必要です。

+0

テンプレートのパラメータは常に最初に宣言されるため、通常の戻り値の型でも引数型にアクセスできます。あなたがアクセスできないのは、パラメータ名、または関数名です。 –

関連する問題