“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& auto x5a = f(); // decltype(x5a) is int decltype(auto) x5d = f(); // decltype(x5d) is int&&
以上是`decltype(auto)` 如何改进 C 中的返回类型推导和模板使用?的详细内容。更多信息请关注PHP中文网其他相关文章!