私は次のコードに出くわしました:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
理解できないことが1つあります。
->
関数の見出しで矢印演算子()が何を意味するかはどこで確認できますか?純粋に論理的には、->
演算子が型を決定し、それauto
が推定されると思いますが、これをまっすぐに取得したいと思います。情報が見つかりません。
私は次のコードに出くわしました:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
理解できないことが1つあります。
->
関数の見出しで矢印演算子()が何を意味するかはどこで確認できますか?純粋に論理的には、->
演算子が型を決定し、それauto
が推定されると思いますが、これをまっすぐに取得したいと思います。情報が見つかりません。
回答:
C ++ 11では、関数宣言には2つの構文があります。
戻り型 識別子 (
引数宣言... )
そして
auto
識別子の (
引数宣言... )
->
return_type
それらは同等です。これらが同等であるのに、なぜ後者を使用したいのですか?さて、C ++ 11 decltype
は、式のタイプを記述できるこの素晴らしいものを導入しました。したがって、引数の型から戻り値の型を導出したい場合があります。だからあなたは試してみます:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
コンパイラーは、それが何であるかa
を知らずb
、decltype
引数に含まれていることを通知します。これは、引数リストによってのみ宣言されているためです。
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の更新: C ++ 14では、
auto
識別子の (
引数宣言... )
関数が使用前に完全に定義されており、すべてのreturn
ステートメントが同じ型に推定される限り。->
あなたがソースファイルで体を非表示にする場合の構文は、(ヘッダで宣言さ)公共の機能のために有用まま。テンプレートではそれができないことはやや明らかですが、他の方法では書くのが難しいいくつかの具象型(通常はテンプレートメタプログラミングによって派生)があります。
C++14
を使用するときに、パーツを必要とせずに何か変更されたものはありますか?今では冗長ですか、それともまだ使用する必要がある他のケースがありますか?それともコンパイラ固有の拡張ですか?auto
return
-> decltype(a + b)
auto
、->
表記としてなしで宣言された戻り型を演繹できますreturn
。->
ソースファイルの本文を非表示にしながらパブリック関数の演繹を使用する場合は、この表記は依然として役立ちます。