ホームページ > バックエンド開発 > C++ > C における `decltype(auto)` の実際の応用例は何ですか?

C における `decltype(auto)` の実際の応用例は何ですか?

Barbara Streisand
リリース: 2024-12-10 06:03:16
オリジナル
507 人が閲覧しました

What are the practical applications of `decltype(auto)` in C  ?

decltype(auto) の用途には何がありますか?

C 14 の decltype(auto) イディオムでは次のような演繹が可能です。指定された式から変数の型を取得します。この機能の主な用途は、自動宣言が decltype ルールに準拠できるようにすることですが、この機能には他にもいくつかの有益な用途があります。

汎用コードでの戻り値の型転送

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; }
ログイン後にコピー
再帰テンプレートを定義すると、インスタンス化中に無限再帰が発生する可能性があります。戻り値の型が decltype(auto) ではなく decltype(...) として宣言されている場合。後者では、テンプレートのインスタンス化後まで戻り値の型の推定を遅らせることができます:

その他の用途

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&&
auto x6a = { 1, 2 };           // decltype(x6a) is std::initializer_list<int>
decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression
auto *x7a = &i;                // decltype(x7a) is int*
decltype(auto)*x7d = &i;       // error, declared type is not plain decltype(auto)
ログイン後にコピー
decltype(auto) は、他のさまざまなコンテキストでも利用できます。 、変数の初期化を含む:

以上がC における `decltype(auto)` の実際の応用例は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート