1. ホーム
  2. c++

[解決済み] 関数見出し内の矢印演算子(->)

2022-04-21 13:51:04

質問

以下のようなコードに出会いました。

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

ひとつだけ、理解できないことがあります。

矢印演算子( -> ) は、関数の見出しの中で何を意味しているのでしょうか?

純粋に論理的に推測すると -> 演算子は型を決定し、その auto が演繹されるのですが、これをはっきりさせたいのです。情報が見つからない。

どのように解決するのですか?

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

戻り値型 識別子 ( 引数宣言... )

そして

auto 識別子 ( 引数宣言... ) -> リターンタイプ

これらは等価である。さて 両者が同等である場合 なぜ後者を使いたいのでしょうか?C++11では、このクールな decltype というものを使って、式の型を記述することができます。そこで、引数の型から戻り値の型を導き出したいと思うかもしれない。というわけで、やってみた。

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

と表示され、コンパイラが abdecltype 引数で指定します。それは、引数リストによってのみ宣言されるからです。

この問題を回避するために、簡単に 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 文は同じ型に推論します。そのため -> 構文は、ソースファイルに本体を隠したいパブリック関数(ヘッダで宣言される)のために有用であることに変わりはありません。しかし、そうでなければ書きにくい具体的な型(通常はテンプレートメタプログラミングによって得られる)があります。