【问题标题】:How does implicit return 0 tie into main's return type deduction? [duplicate]隐式返回 0 如何与 main 的返回类型推导相关联? [复制]
【发布时间】:2015-02-06 15:55:48
【问题描述】:

N3936 [basic.start.main]

2 实现不应预定义main 函数。这 函数不得重载。它应该有一个声明的返回类型 类型为int,但除此之外它的类型是实现定义的。一个 实施应允许两者

——() 的函数返回 int

——(int, 指向char的指针的函数) 返回int

5main中的return语句具有离开main的效果 功能(销毁具有自动存储持续时间的任何对象)和 以返回值作为参数调用std::exit。如果控制 在没有遇到 return 语句的情况下到达 main 的末尾, 效果就是执行

return 0;

DR 1669 在措辞中添加了 declared 一词,这意味着如果要将 main 声明为 auto,则需要尾随返回类型。然而,DR 1003 引入的措辞说,正如上面引用的那样,“一个实现应允许 ... 返回 int 的功能 ...” main 的声明应该是这样的。

因此,鉴于auto 的规则,隐含的return 0; 足以使

auto main() { }

合法吗?

【问题讨论】:

  • 缺陷报告的重点是澄清这部分标准。询问 pre-DR 标准的含义是没有用的,因为委员会已经意识到该标准不够清晰,并将对其进行更改。
  • @SebastianRedl 更改已经出现在 N3936 中,但是?
  • 正如@Sebastian 所说,请记住,稍后的缺陷报告会纠正(感知)标准中的缺陷(内容和/或表示),或使其符合新特性。或者,他们可能会引入新功能,但这里并非如此。所以,后来的 DR 让它变得明确。
  • @2pacisstillalive 我不确定你的意思。 DR 1669 及时进入 C++14,这就是为什么它的状态被列为“C++14”,不是吗?也就是说,C++14标准有“声明”二字,auto main() { }绝对不是有效的C++14。
  • @hvd 好的,我现在明白了 :(

标签: c++ language-lawyer c++14


【解决方案1】:

看来auto main() { } 在 C++14 中是不合法的。

[dcl.spec.auto]

2 占位符类型可以与函数声明符一起出现在 decl-specifier-seqtype-specifier-seqconversion-function-idtrailing-return-type em>,在这样的声明符所在的任何上下文中 有效的。如果函数声明符包含 trailing-return-type (8.3.5),它指定函数的声明返回类型。如果 函数声明的返回类型包含一个占位符类型, 函数的返回类型是从return 中的语句推导出来的 函数的主体,如果有的话。

10 如果函数声明返回类型使用占位符 类型没有return 语句,return 类型被推断为 虽然来自在右括号处没有操作数的 return 语句 函数体。 [ 例子:

auto  f() { } // OK, return type is void
auto* g() { } // error, cannot deduce auto* from void()

结束示例 ]

这似乎暗示由于没有return 语句,main() 被推断为void,因此该程序是非良构的。然而,它留下了一个歧义,似乎允许将隐含的return 0 推导出为int。哦,好吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2016-12-30
    • 2016-01-29
    • 2016-07-23
    相关资源
    最近更新 更多