在下面的代码示例中,main
函数是用C ++ 11尾部返回类型表示法编写的:
auto main() -> int {
//...
return 0;
}
问题:
是否有任何原因应该避免使用具有尾随返回类型的main
并且应该首选经典表示法?
答案 0 :(得分:16)
它完全有效,效果很好。
唯一值得关注的问题是它是新的。它可能会使您熟悉C ++ 98的代码的读者感到困惑或惊讶。
但是它有效,所以如果您愿意,可以随意用这种方式写main
。
答案 1 :(得分:13)
首先,让我们看一下为什么你想要使用尾随返回类型。
Kerrek SB's comment上一个问题:
尾随返回类型是一种主要的专用语言功能 对通用库编写者有用(即泛型编写者) 图书馆,而不是正在写作的普通人物 库),类似于decltype。顺便提一下,两种语言功能 在晦涩或长的lambda表达式中也有一些限制用途,但是 它们不应该用在“普通”用户代码上。
来自Dietmar Kühl's answer(您在之前的问题中已经链接过,因此您必须阅读它):
尾随返回类型的重要性主要是函数 模板,现在可以使用函数的参数 与
decltype()
一起确定返回类型。例如:template <typename M, typename N> auto multiply(M const& m, N const& n) -> decltype(m * n);
这声明函数
multiply()
返回m * n
生成的类型。在decltype()
前面使用multiply()
将无效,因为m
和n
尚未宣布。
我同时考虑Kerrek SB和DietmarKühlC++专家并发现他们的指南很好。现在让我们看看上述指南如何适用于int main()
。一些观察:
int main()
不是功能模板。int
)在可预见的未来不会改变;我们可以安全地承诺这种类型。是否应该避免使用尾随返回类型的主要原因并且应该首选经典表示法?
是的:
它使那些不熟悉新的开发人员感到困惑 句法。
并非所有工具都支持此新语言功能。
如上所述,使用此功能不必 int main()
。
我休息一下。
答案 2 :(得分:6)
这很愚蠢。
没有任何收获,没有必要或有理由写这样的东西。
为了迂腐,您无缘无故地添加了auto
和->
符号。
尾随返回类型通常用于推断引入函数参数后的返回类型。在这里你已经知道了返回类型。
如果您的所有函数都使用了这种表示法而不需要这样做,您能想象代码库的外观吗?你几乎把所有的存储,里程规范,静态等保留在前面,并在最后留下返回类型,与异常规范,const说明符和朋友混在一起?
你不需要说服我的人。 我不反对尾随返回类型;我反对&#34; nouveau riche&#34;使用功能的心态,没有必要这样做,并担心 C ++会变成一大堆风格,并在自身的压力下崩溃。
轻松的规范变化是不稳定和缺乏沟通的迹象。像 Python PEP8 这样的功能将是一件好事,训练有素的眼睛应该谨慎丢弃。