C 14 中的 decltype(auto) 习惯用法允许进行推导来自给定表达式的变量类型。虽然其主要用途是使自动声明能够遵守 decltype 规则,但此功能还有其他几个有价值的应用程序。
在泛型代码中,在不事先知道返回值是引用还是值的情况下完美转发返回类型至关重要。 decltype(auto) 提供此功能:
template<class Fun, class... Args> decltype(auto) Example(Fun fun, Args&&... args) { return fun(std::forward<Args>(args)...); }
定义递归模板时,实例化期间可能会发生无限递归如果返回类型声明为 decltype(...) 而不是 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) 也可以在各种其他上下文中使用,包括变量初始化:
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 中的实际应用是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!