2016-07-27 59 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

相關問題