应该避免使用尾随返回类型吗?

101*_*010 10 c++ program-entry-point c++11 c++14

在下面的代码示例中,main函数是使用C++ 11尾部返回类型表示法编写的:

auto main() -> int {
  //...
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

题:

是否main应该避免使用尾随返回类型并且应该首选经典符号?

jal*_*alf 17

它完全有效,工作得很好.

唯一值得关注的问题是它是新的.它可能会使您熟悉C++ 98的代码的读者感到困惑或惊讶.

但是它有效,所以main如果您愿意,请随意写下这种方式.


Ali*_*Ali 13

首先,让我们看看为什么你想要一般使用尾随返回类型.

Kerrek SB对您上一个问题的评论:

尾随返回类型是一种专用语言功能,对于通用库编写者(即通用库的编写者,而不是通常编写库的通用个性)非常有用,类似于decltype.顺便提一下,两种语言特性在模糊或长lambda表达式中也有一些限制,但它们不应该在"普通"用户代码上大量使用.

来自DietmarKühl的回答(你在之前的问题中已经链接过,所以你必须阅读它):

尾随返回类型的重要性主要用于函数模板,现在可以使用函数的参数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尚未宣布.

我认为Kerrek SB和DietmarKühlC++专家都认为他们的指导方针很好.现在让我们看看上述指南如何适用int main().一些观察:

  • int main() 不是功能模板.
  • 没有类型扣除.
  • 返回类型(int)在可预见的未来不会改变; 我们可以安全地承诺这种类型.

是否应该避免使用尾随返回类型的主要原因并且应该首选经典表示法?

是:

  1. 它使那些不熟悉新语法的开发人员感到困惑.

  2. 并非所有工具都支持此新语言功能.

  3. 如上所述,使用此功能是不必要int main().

我休息一下.


Nik*_*iou 6

这很愚蠢.

没有收获,没有必要或没有理由写这样的东西.

要迂腐,你无缘无故地添加auto->符号.

尾部返回类型通常用于在引入函数参数推断返回类型.在这里你已经知道了返回类型.

如果你的所有函数都使用这种表示法而不需要这样做,你能想象你的代码库吗?你几乎可以保留前面的所有存储,相关规范,静态等,并在最后留下返回类型,与异常规范,const说明符和朋友混在一起?


你不需要说服我的人.我不反对尾随返回类型 ; 我反对使用功能的"暴动"的心态,在那里不需要这样做,并担心C++会变成一大堆风格并在自身的重压下崩溃.

轻松的规范变化是不稳定和缺乏沟通的迹象.像Python的PEP8这样的功能是一件好事,训练有素的眼睛应该谨慎丢弃.

  • 我认为始终为每个函数使用尾随返回类型以保持一致性是合理的.除了更多的打字,我看不出任何劣势. (5认同)
  • "如果你的所有函数都使用了这种符号而不需要这么做,你能想象你的代码库吗?" 我可以.它在语法上更接近于精心设计的语言表达函数类型. (3认同)
  • "你能想象(看起来像你的代码库") - 我的确可以.阅读起来会稍微有点愉快(特别是在返回复杂类型时),但不是那么大的改进,我会与那些喜欢旧式的人争论它. (3认同)
  • "与异常规范,const说明符和朋友混在一起" - 说明符在` - >`之前,而'friend`在开头(与老式返回类型"混合").没有什么与尾随返回类型"混合". (3认同)
  • @NikosAthanasiou我建议你看一下函数在数学中是如何表达的.在函数式编程语言中.或者,基本上*在C系列语言之外的*处*.而且我很乐意向您解释*为什么*将返回类型放在最后是一件非常可怕的事情.如果它"与异常规范,const说明符和朋友混在一起",为什么这是一件坏事呢? (3认同)
  • 有一个论点是你的函数名称很好地排列,如果它也是每行一个.我认为它在C++ 14自动返回类型演绎语法方面也能很好地发挥作用.在这种情况下,简单地保留尾随类型.[例如](http://coliru.stacked-crooked.com/a/28e13f6fcb742fb4).实际上,看到这种风格在CppCon上进行讨论会很有趣. (2认同)