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.
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)...); }
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; }
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!