我碰巧遇到了C ++ 11视频中的以下代码片段,作者使用
auto main()->int
我不明白这一点。我尝试使用g++
在-std=c++11
中进行编译,但它确实有用。
有人可以向我解释这里发生了什么吗?我尝试使用“auto main() - > int”进行搜索,但没有找到任何帮助。
答案 0 :(得分:38)
C ++ 11为尾随返回类型引入了一种表示法:如果函数声明与auto
一起引入,则返回类型将在参数和{{1}之后指定} 序列。也就是说,所有这一切都是宣告->
返回main()
。
尾随返回类型的重要性主要用于函数模板,现在可以使用函数的参数和int
来确定返回类型。例如:
decltype()
这声明函数template <typename M, typename N>
auto multiply(M const& m, N const& n) -> decltype(m * n);
返回multiply()
生成的类型。在m * n
前面使用decltype()
将无效,因为multiply()
和m
尚未宣布。
虽然它主要用于功能模板,但相同的表示法也可用于其他功能。使用C ++ 14,在某些条件下使用n
引入函数时,甚至可以省略尾随返回类型。
答案 1 :(得分:12)
这是C ++ 11中引入的统一函数声明语法尾随返回类型。
你不能对lamdas使用任何其他语法,对于结果类型依赖于参数的函数模板它也非常方便。
如果你想选择一个单一语法(我认为这是一个好主意),那么你没有任何选择:旧语法不能用于lambda。
这样做的原因包括:
好吧,单语法。
功能名称始终位于同一位置,支持快速扫描代码。
同样适用于结果类型,易于视觉识别(另外,当它是成员函数类中定义的类型时,您不必对其进行限定)。
反对的原因包括一些额外的冗长,使用不懂这种语法的旧编译器,任何新的东西都会感到可怕和不舒服而且很奇怪。
答案 2 :(得分:8)
它被称为 trailing-return-type 。它在使用模板的通用代码中特别有用,其中返回类型取决于涉及一些其他模板参数的表达式。它也用于lambda。
以下是一个例子:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t+u)
{
return t + u;
}
此处返回类型取决于表达式t+u
。因此无论表达式是什么类型,也是函数的返回类型,由decltype(t+u)
表示。