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

时间:2016-11-10 10:07:33

标签: c++ short-circuiting noreturn

假设我有一个带签名[[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]]的标准的措辞是否没有解决这一问题,即放宽对类型的要求以使这些表达“合法化”?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

您正在寻找的概念称为bottom type。在类型系统中,底部类型是可转换为任何其他类型的类型。 (并将其与top type进行比较,所有类型都可以转换为。{/ p>

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

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

答案 2 :(得分:0)

每个表达式都必须具有明确的类型,句点。因此,即使函数没有返回,仍然可以评估表达式的类型check_some_condition() or die(EXIT_FAILURE)

由此可见,函数返回类型必须可用于逻辑运算。