auto main() - > int是什么意思?

Sta*_*kIT 22 c++ c++11

我碰巧遇到了作者使用的C++ 11视频中的以下代码片段

auto main()->int
Run Code Online (Sandbox Code Playgroud)

我不明白这一点.我尝试编译g++使用-std=c++11,它的工作原理.有人可以向我解释这里发生了什么吗?我试图使用"auto main() - > int"进行搜索,但没有找到任何帮助.

Die*_*ühl 42

C++ 11引入了尾随返回类型的表示法:如果引入了函数声明auto,则将在参数和->序列之后指定返回类型.也就是说,所有这一切都是宣布main()返回int.

尾随返回类型的重要性主要用于函数模板,现在可以使用函数的参数decltype()来确定返回类型.例如:

template <typename M, typename N>
auto multiply(M const& m, N const& n) -> decltype(m * n);
Run Code Online (Sandbox Code Playgroud)

这声明函数multiply()返回由生成的类型m * n.decltype()在前面使用multiply()将是无效的,因为m并且n尚未宣布.

虽然它主要用于功能模板,但相同的表示法也可用于其他功能.使用C++ 14,auto在某些条件下引入函数时,甚至可以省略尾随返回类型.

  • 以这种方式声明主要的优势是什么? (14认同)
  • @PaperBirdMaster:我并不是说有优势.但是,这是允许的,而不是替代方案. (6认同)
  • 对于这个误解我很抱歉,我并没有告诉你说'main`上的尾随返回类型(TRT)有优势,我只是问(并且想知道)这个TRT的使用是否有任何优势这个背景......我认为包括这个解释(如果有的话)会很好地改善答案 (2认同)

Che*_*Alf 12

这是一个统一的函数声明语法,尾部返回类型,在C++ 11中引入.

您不能对lamdas使用任何其他语法,并且对于结果类型依赖于参数的函数模板也非常方便.

如果你想选择一个单一的语法(我认为这是一个好主意),那么你没有任何选择:旧的语法不能用于lambdas.

这样做的原因包括:

  • 好吧,单一的语法.

  • 功能名称始终在视觉上相同,支持快速扫描代码.

  • 同样适用于结果类型,简单的视觉识别(另外,当它是成员函数类中定义的类型时,您不必限定它).

反对的原因包括一些额外的冗长,使用不理解这种语法的旧编译器,任何新的东西都会感到可怕和不舒服而且很奇怪.

  • **我个人认为`auto main() - > int`是一个可怕的想法.***"嗯,单一语法."*除了已存在的数百万行代码.无论如何,它将与旧代码混合使用.*"功能名称始终在视觉上相同的位置,支持快速扫描代码."*我使用IDE生成的轮廓,扫描速度更快.*"同样的结果类型,简单的视觉识别."*为什么更容易找到`auto main() - > int`中的返回类型而不是`int main()`,其中返回类型是正确的,我不需要通读任何东西才能找到它? (10认同)
  • +1.我甚至在正常的代码中使用这种语法就此而言:*函数名称始终在视觉上相同的位置,支持快速扫描代码*.我们人类很容易用很少的努力找出函数的名称,因为在`auto`之后,函数名被写入.所有功能在视觉上都相同. (3认同)
  • @Ali:re"为什么在auto main() - > int中找到返回类型比在返回类型正好在前面的int main()中更容易,我不需要通读任何内容来查找它当你发现有必要攻击一个稻草人的论点时,你承认没有真正的争论.然而,恐惧和反感的感觉是不做某事的正当理由.无论感情如何不合理,它们确实会影响一个人的行为,而一个人的行动可能会低得多. (3认同)
  • @ Cheersandhth.-Alf*"你正在攻击"*我没有攻击任何人/任何东西.我发表评论说我不同意,并说明了我的原因.你仍然没有给我*任何*原因,为什么在`auto main() - > int`中找到返回类型比在`int main()`中更容易. (3认同)
  • @Ali:我认为`auto main() - > int`没有任何问题. (2认同)

Naw*_*waz 8

它被称为trailing-return-type.它在使用模板的通用代码中特别有用,其中返回类型取决于涉及一些其他模板参数的表达式.它也用于lambda.

这是一个例子:

template<typename T, typename U>
auto add(T t, U u) -> decltype(t+u)
{
   return t + u;
}
Run Code Online (Sandbox Code Playgroud)

这里的返回类型取决于表达式t+u.因此无论表达式是什么类型,也是函数的返回类型,由表示decltype(t+u).