我遇到了以下代码:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { return a+b; }
有一件事我无法理解:
我在哪里可以找到->函数标题中箭头运算符 ( ) 的含义?
->
我想纯粹从逻辑上讲,->运算符确定了一种类型,auto将被推导出来,但我想弄清楚这一点。我找不到任何信息。
auto
在 C++11 中,函数声明有两种语法:
返回 类型 标识符 参数声明… ( )
(
)
和
auto 标识符 ( 参数声明 … return_type) -> __
它们是等价的。现在,当它们等价时,您为什么要使用后者?好吧,C++11 引入了一个很酷decltype的东西,可以让你描述表达式的类型。因此,您可能希望从参数类型派生返回类型。所以你尝试:
decltype
template <typename T1, typename T2> decltype(a + b) compose(T1 a, T2 b);
并且编译器会告诉您它不知道参数中的内容a和内容。那是因为它们仅由参数列表声明。b``decltype
a
b``decltype
declval您可以通过使用和已声明的模板参数轻松解决此问题。喜欢:
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);
而且它不那么冗长,范围规则不需要更改。
**C14 更新:** C14 也只允许
标识符auto 参数 ( -声明… )
只要函数在使用前被完全定义并且所有return语句都推导出为相同的类型。->如果您想在源文件中隐藏正文,该语法对于公共函数(在标头中声明)仍然有用。显然,模板无法做到这一点,但是有一些具体的类型(通常通过模板元编程派生)很难以其他方式编写。
return