2014-03-19 54 views
54

,我发现这样的代码:箭头操作符 - 函数标题(>)

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { 
    return a+b; 
} 

,我和所有的细节,这是新的给我,但一想通。 请告诉我,我在哪里可以阅读,箭头运算符(->)在函数标题中的含义是什么? 我想纯粹逻辑上,->运营商确定一个类型,这将得到auto,但我想弄明白,但无法找到信息。

+2

它是尾随返回类型语法的一部分。请参阅http://stackoverflow.com/a/4113390/962089 – chris

+1

它不是运算符,而是语法的一部分。 – texasbruce

+0

在回答“我可以在哪里阅读?”时,C++规范是最权威的。缺乏资金或愿望花费$$,最后的工作草案通常足够接近和免费。这些规格非常专业,因此对阅读ISO规格缺乏熟悉度,请尝试cplusplus.com或cppreference.com或其他此类不具权威性的网站,但通常非常准确。注意:从C++ 14开始,尾随返回类型可以省略。 – Les

回答

86

在C++ 11中,有两个用于语法函数声明:

        返回型标识符(参数-声明...)

        auto标识(说法,声明...)-> return_type

他们是等价的。现在,当他们相当时,你为什么要使用后者?那么,C++ 11介绍了这个很酷的decltype的东西,可以让你描述一个表达式的类型。所以你可能想从参数类型派生返回类型。所以,你试试:

template <typename T1, typename T2> 
decltype(a + b) compose(T1 a, T2 b); 

,编译器会告诉你,它不知道什么ab都在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陈述推断为相同类型。如果要隐藏源文件中的正文,->语法对于公用函数(在头文件中声明)仍然有用。有些显然不能用模板完成,但是有一些具体的类型(通常是通过模板元编程获得的),否则很难写。

+0

非常好,整洁而翔实的回复@Jan Hudec。表示赞许,满意,胜利。在'C++ 14'中有什么改变,因为我在''decltype(a + b)''部分中使用'auto'作为'return'类型的函数。现在它是多余的还是还有其他情况下仍然应该使用?或者它是一个编译器特定的扩展? – Shadi

+1

@Shadi,C++ 14包含[N3638](https://isocpp.org/files/papers/N3638.html),它允许扣除声明为'auto'的返回类型,而不使用' - >'表示法,只要该函数在使用前完全定义并且所有'return'语句推导为相同的类型。如果你想在公开函数中使用演绎而隐藏源文件中的主体,' - >'表示法仍然有用。 –

12

用普通英语说明返回类型是ab之和的推断类型。