隐式返回 0 如何与主的返回类型扣除相关联?
How does implicit return 0 tie into main's return type deduction?
N3936 [basic.start.main]
2
实现不应预定义main
函数。这 功能不得过载。它应具有声明的返回类型 类型为int
,但除此之外,其类型是实现定义的。一 实施应允许两者—
()
返回int
和— (
int
的函数,指针指向指向char
的指针(返回int
5
main
中的 return 语句具有离开主语句的效果 功能(销毁具有自动存储持续时间的任何对象(和 使用返回值作为参数调用std::exit
。如果控制 到达主的末尾而不遇到返回语句, 效果是执行的效果return 0;
DR 1669在措辞中添加了声明一词,暗示如果要声明main
auto
,则需要尾随返回类型。然而,DR 1003引入的措辞说,如上面的引文所示,"实现应允许两个功能......返回int
..." 当涉及到main
声明应该是什么样子时,这种措辞就不那么严格了。
所以,给定auto
规则,是一个隐含的return 0;
足以使
auto main() { }
法律?
auto main() { }
在 C++14 中是不合法的。
[dcl.spec.auto]
2
占位符类型可以与函数声明符一起出现在 decl-specifier-seq、type-specifier-seq、convert-function-id 或尾随返回类型,在此类声明符为 有效。如果函数声明符包含尾随返回类型 (8.3.5(,指定函数的声明返回类型。如果 函数的声明返回类型包含一个占位符类型, 函数的返回类型是从 中的return
语句推导出来的 函数的主体(如果有(。
10
如果函数具有使用占位符的声明返回类型 类型没有return
语句,return
类型推导为 虽然来自在右大括号处没有操作数的返回语句 函数体。[ 示例:auto f() { } // OK, return type is void auto* g() { } // error, cannot deduce auto* from void()
— 结束示例 ]
这似乎意味着由于没有return
语句,因此main()
被推断为void
,因此程序格式不正确。然而,它留下了一个模棱两可的地方,似乎允许将隐含return 0
推断为int
。哦,好吧。
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 基于返回类型的转换和过载扣除
- 隐式返回 0 如何与主的返回类型扣除相关联?