为什么要检查[[noreturn]]函数的返回类型?
Why is a [[noreturn]] function checked for return type?
假设我有一个签名为[[noreturn]] void die(int exit_code);
的函数。如果我写这个语句:
check_some_condition() or die(EXIT_FAILURE);
我得到一个错误消息(GCC 5.4.0):
error: expression must have bool type (or be convertible to bool)
但是为什么要检查类型,如果编译器知道进入该函数,返回值无关紧要;如果条件成立,返回类型又无关紧要吗?
Edit:关于[[noreturn]]
的标准措辞是否没有解决这一点,即放宽对类型的要求以使此类表达式"合法化"?
您正在寻找的概念被称为底部类型。在类型系统中,底层类型是可转换为任何其他类型的类型。(还可以将它与顶部类型进行比较,所有类型都可以转换。)
bottom类型是不返回的函数的完美选择。将它赋值给任何东西都是类型安全的,因为赋值永远不会发生。如果c++有一个底类型,如果你声明函数返回底类型,那么你的代码段可能是完全合法的,你的期望也是正确的。
不幸的是,c++没有这样的类型。正如已经指出的那样,[[noreturn]]
不是一种类型——它是一种用于以与类型系统正交的方式表达意图(对其他程序员和优化器)的属性。对于类型检查器,函数的返回类型仍然是void
,不能转换为布尔值
noreturn
没有告诉编译器该函数不返回值。它告诉编译器该函数不会返回。它对函数的返回类型也没有影响。
在表达式中,编译器需要检查表达式的操作数是否具有有效类型。在像check_some_condition() or die(EXIT_FAILURE)
这样的表达式中,这需要检查check_some_condition()
和die()
的返回类型。noreturn
不影响函数的返回类型,因此不影响检查的需要。如果函数返回void
,表示表达式无效
每个表达式都必须有一个明确的类型,句号。因此,即使函数不返回,仍然可以计算表达式check_some_condition() or die(EXIT_FAILURE)
由此可以得出,函数返回类型必须可用于逻辑操作
相关文章:
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?