C++ 替代函数语法差异

C++ 替代函数语法差异,c++,c++11,declaration,function-declaration,C++,C++11,Declaration,Function Declaration,这两种功能有什么区别 auto func(int a, int b) -> int; int func(int a, int b); 他们使用不同的语法,只有一个在C++版本之前是C++ 11有效的。除此之外,在您的问题中显示的两个函数声明之间没有区别。除了表示法,在上述情况下没有任何区别。当您想要引用一个或多个参数来确定函数的返回类型时,备用函数声明语法变得非常重要。例如: template <typename S, typename T> auto multiply(S

这两种功能有什么区别

auto func(int a, int b) -> int;

int func(int a, int b);

<>他们使用不同的语法,只有一个在C++版本之前是C++ 11有效的。除此之外,在您的问题中显示的两个函数声明之间没有区别。

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

template <typename S, typename T>
auto multiply(S const& s, T const& t) -> decltype(s * t);
模板
自动乘法(S常量和S,T常量和T)->decltype(S*T);

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

这两个声明之间没有有用的区别;这两个函数都返回一个
int


C++11的尾随返回类型对于带有
template
参数的函数很有用,其中返回类型直到编译时才知道,例如在这个问题中:

我从来都不理解为什么编译器不能用旧语法处理相同的返回类型,例如:
template decltype(s*t)multiply(s const&s,t const&t)你知道为什么吗?@莱梅斯:编译器有可能与旧风格的语法一样,但是C++总是遵循在声明之前没有名字可见的规则。这个规则是否是一个好的规则是一个单独的问题,但一致性有帮助。@billz:当然,lambda规则和尾部返回有点密切相关:如果函数没有尾部返回,那么lambda也会使用不同的东西。我似乎记得,这两种符号几乎是一起开发的。@leemes:是的,这是正确的,但并不违反规则:在类定义中定义的成员函数被视为是在类定义之外定义的,紧跟在类定义之后。类中的成员定义只是一个简单的例子(尽管我不太确定它如何与类模板中的
friend
函数一起工作,因为这些函数不能在类定义之外定义)。+1:可能是一个愚蠢的例子,但仍然是一个非常精确的例子。