函数头中的箭头运算符
在 C 11 及更高版本中,函数声明存在两种语法:
传统语法:
return-type identifier(argument-declarations...)
现代语法:
auto identifier(argument-declarations...) -> return_type
两种语法是等效的。然而,现代语法提供了一种从参数类型推断返回类型的便捷方法。这在使用 decltype 说明符时特别有用,它使您能够描述表达式的类型。
在以前的 C 版本中,您可以编写:
template <typename T1, typename T2> decltype(a + b) compose(T1 a, T2 b);
但是,编译器会在尝试确定返回类型时不知道 a 和 b 是什么。
要解决此问题,您可以使用 declval:
template <typename T1, typename T2> decltype(std::declval<T1>() + std::declval<T2>()) compose(T1 a, T2 b);
但是,这会变得冗长。相反,现代语法允许您编写:
template <typename T1, typename T2> auto compose(T1 a, T2 b) -> decltype(a + b);
此语法更简洁,并保持相同的范围规则。
C 14 更新:
C 14 允许使用以下语法:
auto identifier(argument-declarations...)
只要函数在使用前完全定义并且所有 return 语句推导出相同的类型。
使用案例:
箭头运算符 (->) 语法对于在头文件中声明的公共函数仍然有用,您希望在源文件中隐藏实现。这对于模板函数或通过模板元编程派生的专用具体类型尤其相关。
以上是什么时候应该在 C 函数头中使用箭头运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!