0

假设我有一个带有签名的函数[[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)

但是为什么要检查类型,如果编译器知道进入该函数,则返回值无关紧要;如果条件检查出来,返回类型再次无关紧要吗?

编辑:有关标准的措辞是否[[noreturn]]没有解决这一点,即放宽对类型的要求以使此类表达“合法化”?

4

3 回答 3

3

您正在寻找的概念称为底部类型。在类型系统中,底部类型是可转换为任何其他类型的类型。(还将它与所有类型都可以转换的顶级类型进行比较。)

底部类型是不返回函数的完美候选者。将它分配给任何东西都是类型安全的,正是因为无论如何分配都不会发生。如果 C++ 有一个底部类型,并且如果您将函数声明为返回底部类型,那么您的代码段可能是完全合法的,并且您的期望是正确的。

不幸的是,C++ 没有这样的类型。正如已经指出的,[[noreturn]]不是类型——它是一个属性,用于以与类型系统正交的方式表达意图(对其他程序员和优化器)。就类型检查器而言,函数的返回类型仍然是void并且不能转换为布尔值。

于 2016-11-10T10:28:06.723 回答
3

noreturn不会告诉编译器该函数没有返回值。它告诉编译器该函数不会返回。它也对函数的返回类型没有影响。

在表达式中,编译器需要检查表达式的操作数是否具有有效类型。在类似 的表达式中,需要检查和check_some_condition() or die(EXIT_FAILURE)的返回类型。 不影响函数的返回类型,因此不影响该检查的需要。如果函数返回,则表达式无效。check_some_condition()die()noreturnvoid

于 2016-11-10T10:25:12.150 回答
0

每个表达式都必须有一个确定的类型,句号。所以即使函数没有返回,它仍然必须可以计算表达式的类型check_some_condition() or die(EXIT_FAILURE)

因此,函数返回类型必须在逻辑操作中使用是可行的。

于 2016-11-10T10:13:39.660 回答