あるシステム ヘッダー ファイルには、次のような式が含まれています。
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{…}
「->」が何を意味するのかわかりません。ポインター式でもラムダ式でもありません。誰か助けてもらえますか?
これは 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;
}
編集: C++14 以降では、関数定義(つまり、関数の本体を定義するとき)auto add(const T& x, const U& 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
式の型を「返します」。動作するためには宣言されているx
必要があるため、新しい構文が必要です。y
decltype(x + y)