Home >Backend Development >C++ >What are the practical applications of `decltype(auto)` in C ?

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

Barbara Streisand
Barbara StreisandOriginal
2024-12-10 06:03:16571browse

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

What are some uses of decltype(auto)?

The decltype(auto) idiom in C 14 allows for the deduction of a variable's type from a given expression. While its primary use is for enabling auto declarations to adhere to decltype rules, there are several other valuable applications for this feature.

Return Type Forwarding in Generic Code

Within generic code, it is crucial to perfectly forward return types without prior knowledge of whether the return value is a reference or a value. decltype(auto) provides this functionality:

template<class Fun, class... Args>
decltype(auto) Example(Fun fun, Args&&... args) 
{ 
    return fun(std::forward<Args>(args)...); 
}

Delaying Return Type Deduction in Recursive Templates

When defining recursive templates, an infinite recursion during instantiation can occur if the return type is declared as decltype(...) instead of decltype(auto). The latter allows for delaying return type deduction until after template instantiation:

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; }

Other Uses

decltype(auto) can also be utilized in various other contexts, including variable initialization:

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)

The above is the detailed content of What are the practical applications of `decltype(auto)` in C ?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn