隐式返回0如何与主要的返回类型扣除相关联?

时间:2014-12-08 21:35:22

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

N3936 [basic.start.main]

  

2实现不应预定义main函数。这个   功能不得超载。它应具有声明的返回类型   类型int,但其类型是实现定义的。一个   实施应允许两者

     

- ()返回int

的函数      

- 返回int

的函数(char,指向int的指针)      

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

return 0;

DR 1669在措辞中添加了声明这个词,暗示如果main被声明为auto,则需要尾随返回类型。但是,DR 1003引入的措辞,如上面的引文所述,“一个实现应该允许......返回int ...的功能”这个措辞不那么严格它涉及main的声明应该是什么样的。

因此,根据auto的规则,隐含的return 0;足以构成

auto main() { }

合法?

1 个答案:

答案 0 :(得分:0)

{+ 1}}似乎在C ++ 14中不合法。

[dcl.spec.auto]

  

auto main() { }占位符类型可以带有函数声明符    decl-specifier-seq type-specifier-seq conversion-function-id trailing-return-type ,在任何这种声明者的上下文中   有效。如果函数声明符包含 trailing-return-type   (8.3.5),指定函数的声明返回类型。如果   函数的声明返回类型包含占位符类型,   函数的返回类型是从2语句中推导出来的   功能的主体,如果有的话。

     

return如果具有声明的返回类型的函数使用占位符   type没有10语句,return类型被推导为   虽然来自一个返回语句,但在结束括号中没有操作数   功能体。 [示例:

return
     

- 结束示例]

这似乎意味着由于没有auto f() { } // OK, return type is void auto* g() { } // error, cannot deduce auto* from void() 个陈述,return被推断为main(),因此该程序格式不正确。然而,它留下了一个模棱两可的开放,似乎允许将隐式void推导为return 0。哦,好吧。