web-dev-qa-db-ja.com

関数見出しの矢印演算子(->)

私はそのようなコードを見つけました:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

私はすべての詳細を把握しましたが、それは私にとっては新しいことでしたが、1つだけです。教えてください、どこで読むことができますか、矢印演算子(->)関数の見出しの意味?純粋に論理的には、->演算子は、autoによって取得される型を決定しますが、これをまっすぐに取得したいのですが、情報が見つかりません。

105
user1234567

C++ 11には、関数宣言の2つの構文があります。

return-typeidentifier(引数宣言...)

そして

autoidentifier(引数宣言...)-> return_type

それらは同等です。今、それらが同等であるとき、なぜあなたは後者を使用したいのですか?さて、C++ 11では、式の型を説明できるこのクールなdecltypeを導入しました。そのため、戻り値の型を引数の型から派生させたい場合があります。だからあなたは試してください:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

コンパイラは、a引数にbdecltypeが含まれているかどうかを知らないことを通知します。これは、引数リストによってのみ宣言されているためです。

declvalと既に宣言されているテンプレートパラメーターを使用することで、問題を簡単に回避できます。好む:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

現在、非常に詳細になっています。したがって、代替宣言構文が提案および実装され、次のように記述できます。

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

冗長性が低く、スコープルールを変更する必要はありませんでした。


C++ 14 update: C++ 14では、

autoidentifier(引数宣言...)

関数が使用前に完全に定義されており、すべてのreturnステートメントが同じ型に推定される限り。 ->構文は、ソースファイルで本文を非表示にする場合、パブリック関数(ヘッダーで宣言)で引き続き有用です。テンプレートを使用してそれを行うことはできませんが、他の方法では書きにくい具体的なタイプ(通常はテンプレートメタプログラミングから派生)があります。

165
Jan Hudec

平易な英語では、戻り型がabの合計の推定型であることを示しています。

17
murrekatt