假设我有一个带签名[[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]]
的标准的措辞是否没有解决这一问题,即放宽对类型的要求以使这些表达“合法化”?
答案 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)
由此可见,函数返回类型必须可用于逻辑运算。