为什么要检查[[noreturn]]函数的返回类型?

Why is a [[noreturn]] function checked for return type?

本文关键字:返回类型 函数 noreturn 检查 为什么      更新时间:2023-10-16

假设我有一个签名为[[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)

的类型。

由此可以得出,函数返回类型必须可用于逻辑操作