,我发现这样的代码:箭头操作符 - 函数标题(>)
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
,我和所有的细节,这是新的给我,但一想通。 请告诉我,我在哪里可以阅读,箭头运算符(->
)在函数标题中的含义是什么? 我想纯粹逻辑上,->
运营商确定一个类型,这将得到auto
,但我想弄明白,但无法找到信息。
,我发现这样的代码:箭头操作符 - 函数标题(>)
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
,我和所有的细节,这是新的给我,但一想通。 请告诉我,我在哪里可以阅读,箭头运算符(->
)在函数标题中的含义是什么? 我想纯粹逻辑上,->
运营商确定一个类型,这将得到auto
,但我想弄明白,但无法找到信息。
在C++ 11中,有两个用于语法函数声明:
返回型标识符(
参数-声明...)
和
auto
标识(
说法,声明...)
->
return_type
他们是等价的。现在,当他们相当时,你为什么要使用后者?那么,C++ 11介绍了这个很酷的decltype
的东西,可以让你描述一个表达式的类型。所以你可能想从参数类型派生返回类型。所以,你试试:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
,编译器会告诉你,它不知道什么a
和b
都在decltype
说法。那是因为它们只是由参数列表声明的。
通过使用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
标识符(
参数-声明...)
只要功能在使用前全部定义并且所有return
陈述推断为相同类型。如果要隐藏源文件中的正文,->
语法对于公用函数(在头文件中声明)仍然有用。有些显然不能用模板完成,但是有一些具体的类型(通常是通过模板元编程获得的),否则很难写。
非常好,整洁而翔实的回复@Jan Hudec。表示赞许,满意,胜利。在'C++ 14'中有什么改变,因为我在''decltype(a + b)''部分中使用'auto'作为'return'类型的函数。现在它是多余的还是还有其他情况下仍然应该使用?或者它是一个编译器特定的扩展? – Shadi
@Shadi,C++ 14包含[N3638](https://isocpp.org/files/papers/N3638.html),它允许扣除声明为'auto'的返回类型,而不使用' - >'表示法,只要该函数在使用前完全定义并且所有'return'语句推导为相同的类型。如果你想在公开函数中使用演绎而隐藏源文件中的主体,' - >'表示法仍然有用。 –
用普通英语说明返回类型是a
和b
之和的推断类型。
它是尾随返回类型语法的一部分。请参阅http://stackoverflow.com/a/4113390/962089 – chris
它不是运算符,而是语法的一部分。 – texasbruce
在回答“我可以在哪里阅读?”时,C++规范是最权威的。缺乏资金或愿望花费$$,最后的工作草案通常足够接近和免费。这些规格非常专业,因此对阅读ISO规格缺乏熟悉度,请尝试cplusplus.com或cppreference.com或其他此类不具权威性的网站,但通常非常准确。注意:从C++ 14开始,尾随返回类型可以省略。 – Les