2016-07-27 64 views
18

我从来没有见过[[ noreturn ]]之前用过无void返回函数。我可以在非无效返回函数上使用[[noreturn]]吗?

以下定义清楚吗?

[[ noreturn ]] int function(); 

int function(){ 
    while(true){/* impl */} 
    return 0; 
} 

返回类型必须是int究其原因,是因为函数是通过一个函数指针传递给另一个函数。

因此,假设主叫看起来是这样的:

//call the non-returning function 
int var = (*fptr)(); 

//use var some way (even though the function will never actually return) 
std::cout << var; 

将本次展览任何一种未定义行为?

+3

您可能会遇到迂腐麻烦,并假定执行的结果是无限循环结束。 ([link](http://blog.regehr.org/archives/161)) – chris

+0

@chris我希望用[[maybe_unused]]标记返回值。 –

+4

从您发布的链接:*如果具有此属性的功能实际返回,则行为未定义。* – 101010

回答

23

[[noreturn]]的标准规格在[dcl.attr.noreturn]中。整个规范文本读取:

属性令牌noreturn指定函数不返回。在 每个属性列表属性参数子句必须出现最多一次。该属性可以在函数声明中应用于 声明者ID。如果该函数的任何声明指定noreturn属性,则函数的第一个声明应指定noreturn 属性。如果在一个翻译单元中用 属性声明函数,并且在另一个翻译单元中声明了相同的函数而没有该属性,则该程序是不合格的;不需要诊断。

如果一个函数f被称为地方f先前与noreturn属性声明和f最终返回, 的行为是不确定的。

没有提及退货型号。唯一重要的是该函数不会返回。如果函数返回(无论是void还是intvector<vector<double>>),则行为是未定义的。如果函数没有返回,则返回类型不重要。

10

从C++标准§7.6.8/ P2 noreturn属性[dcl.attr.noreturn](重点矿山

如果函数f被称为其中f先前被宣布与 noreturn属性和f最终返回,行为是未定义的 。 [注意:该函数可能会抛出异常终止。 - 结束注释] [注意:如果标有[[noreturn]]的功能可能返回,鼓励实施 发出警告。 - 结束 注意]

由于你的功能永远不会达到return 0;没有UB。

+5

这是如何回答问题的? OP知道它不应该回来,他在问它的类型。 –

+0

标准报价如何阐明它*是* ub? OP的功能不会最终返回。 – Barry

+0

@Barry不会返回'0'吗? – 101010

相关问题