替代函数语法的区别

7
这两个函数有什么不同?
auto func(int a, int b) -> int;

int func(int a, int b);
3个回答

10

除了符号表示外,在上述情况下没有任何区别。当您想要引用一个或多个参数来确定函数的返回类型时,替代函数声明语法变得很重要。例如:

template <typename S, typename T>
auto multiply(S const& s, T const& t) -> decltype(s * t);

(是的,这只是个愚蠢的例子)


3
编译器可能也可以处理旧风格的语法,但C++一贯遵循这样一个规则:在声明之前,任何名称都不可见。这个规则是否值得拥有是另一个问题,但保持一致有助于编程。 - Dietmar Kühl
1
@billz:当然,lambda规则和尾随返回在某种程度上是相辅相成的:如果对于函数没有尾随返回,那么与lambda一起使用的东西将会有所不同。我记得这两种符号表示法几乎是同时开发出来的。 - Dietmar Kühl
2
@leemes:是的,这是正确的,但它不违反规则:在类定义内定义的成员函数被视为在类定义之外立即定义的成员函数。类内部的成员定义只是一个简写(虽然我不太确定在类模板内部的 friend 函数如何工作,因为这些函数不能在类定义之外定义)。 - Dietmar Kühl
从这个角度来看,@DietmarKühl 是对的。然而,使用旧语法来返回 decltype 类型会是一个很好的特性...但是我们不能拥有一切 ;) - leemes
1
+1:或许这只是个愚蠢的例子,但却非常精确。 - WhozCraig
显示剩余2条评论

5

这两个声明没有实用差别,两个函数都返回一个int

C++11的尾置返回类型在带有template参数的函数中非常有用,在这种情况下,返回类型直到编译时才知道,比如这个问题:如何正确编写尾置返回类型?


2

它们使用不同的语法,只有其中一个在C++11之前的版本中是有效的。除此之外,在您提出的问题中,这两个函数声明之间没有任何区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接