ホームページ >バックエンド開発 >C++ >`decltype(auto)` は C での戻り値の型推定とテンプレートの使用法をどのように改善しますか?

`decltype(auto)` は C での戻り値の型推定とテンプレートの使用法をどのように改善しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-11 18:48:10687ブラウズ

How Does `decltype(auto)` Improve Return Type Deduction and Template Usage in C  ?

'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&amp;
auto x5a = f();            // decltype(x5a) is int
decltype(auto) x5d = f();  // decltype(x5d) is int&amp;&amp;

以上が`decltype(auto)` は C での戻り値の型推定とテンプレートの使用法をどのように改善しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。