'decltype(auto)' 言語機能の使用
C 14 で導入された 'decltype(auto)' イディオムにより、' auto' 宣言は、主に関数の戻り値の型推定のために、指定された式で 'decltype' ルールを利用します。ただし、その有用性はこのシナリオを超えて拡張されます。
ジェネリック コードでの戻り値の型転送
非ジェネリック コードの場合、参照として戻り値の型を明示的に選択できます。ただし、汎用コードでは、「decltype(auto)」を使用すると、戻り値の型が参照であるか値であるかに関係なく、正確な戻り値の型転送が可能になります。
template<class Fun, class... Args> decltype(auto) Example(Fun fun, Args&&... args) { return fun(std::forward<Args>(args)...); }
再帰的テンプレートでの戻り値の型推定の遅延
再帰テンプレートを定義する場合、「decltype(auto)」は戻り値の型の推論を後まで延期できます。テンプレートのインスタンス化。
template<int i> struct Int {}; constexpr auto iter(Int<0>) -> Int<0>; template<int i> constexpr auto iter(Int<i>) -> decltype(auto) { return iter(Int<i-1>{}); } int main() { decltype(iter(Int<10>{})) a; }
追加のアプリケーション
標準 N3936 草案によれば、「decltype(auto)」は関数宣言子、タイプなどのさまざまなコンテキストで使用できます。指定子と変数の初期化。これらのコンテキストは、戻り値の型の推論、型のプレースホルダーの指定、安全な値の割り当てなどのアクションにユーティリティを提供します。
int i; int&& f(); auto x3a = i; // decltype(x3a) is int decltype(auto) x3d = i; // decltype(x3d) is int auto x4a = (i); // decltype(x4a) is int decltype(auto) x4d = (i); // decltype(x4d) is int& auto x5a = f(); // decltype(x5a) is int decltype(auto) x5d = f(); // decltype(x5d) is int&&
以上が`decltype(auto)` は C での戻り値の型推定とテンプレートの使用法をどのように改善しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。