2016-11-10 31 views
0

假设我具有签名[[noreturn]] void die(int exit_code);的功能。如果我写的语句:为什么检查返回类型的[[noreturn]]函数?

check_some_condition() or die(EXIT_FAILURE); 

我得到一个错误信息(使用GCC 5.4.0):

error: expression must have bool type (or be convertible to bool) 

偏偏是检查类型,如果编译器知道进入该功能,返回值无关紧要;如果条件检出,返回类型无关紧要?

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

+1

那么,函数'die'不返回'bool'也不可将其转化为'bool'一个类型(例如,'int')。你为什么期望编译器能够将它转换为布尔表达式?实际的问题应该是:如果**你知道进入该函数,返回值无关紧要,那么为什么你把它作为布尔表达式的一部分? –

+1

@TheodorosChatzigiannakis [[noreturn]]根本不是一种类型。这是一个属性。 – StoryTeller

+0

@StoryTeller:1.忘记输入'void'。 2.事实上,我希望有一个'[noreturn]]空白'(或[[noreturn]]'什么)可以“转换”为任何类型,因为你实际上不需要进行转换,所以你可以安全地认为这是可能的。 – einpoklum

回答

0

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

并且由此得出函数返回类型必须可用于逻辑操作。

+0

问题是,您可以很好地确定表达式的类型,至少就执行该程序而言至关重要:除非是bool,否则由于[[[noreturn]]' 。 – einpoklum

+0

@einpoklum,你并不是说这种类型可以很好地确定,你认为它是无关紧要的。那些不是一回事。 – StoryTeller

+0

我建议类型的“良好决定”可以[扩展而不是故意](https://en.wikipedia.org/wiki/Extensional_and_intensional_definitions#Intensional_definition),以便在某种程度上滥用这些定义。表情会像鸭子一样走路,像鸭子一样嘎嘎,所以它是一只够好的鸭子。 – einpoklum

3

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

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

+0

那么,我的理解是它应该影响函数的返回类型,或者至少是涉及函数的表达式的类型。标准中是否包含有关[[noreturn]]的措词? – einpoklum

+0

我必须检查确切的写法,但标准有效地说'noreturn'是函数的一个属性,而不是它的返回类型。这意味着它不会影响返回类型。 – Peter

+0

“A,这意味着B” - A不一定意味着B我的朋友:-) – einpoklum

3

你正在寻找的概念被称为bottom type。在类型系统中,底部类型是可转换为任何其他类型的类型。 (也可将其与所有类型都可兑换的top type进行比较。)

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

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

相关问题