2015-10-24 25 views
3

根據C++ 14標準,以下程序是否形成不正確?C++語句中的語句(void)f()的狀態是14嗎?如果沒有,是f()部分的放棄值?

int f() { return 42; } 

int main() { 
    (void)f(); 
} 

如果不是,是放棄值表達式中唯一的函數調用表達式嗎? (注意是子表達式,而不是整個表達式語句)

+2

您是否有任何引用使您認爲'(void)f()'不合格? –

+0

@RSahu:那麼void是一個不完整的類型,所以:'void t = f();'是不合格的,因此我期望'(void)x'意味着(沒有相反的措辭)創建一個臨時類型void,相當於前面提到的不合格的'void t = f();'。然而在C中這是格式良好的,所以我不清楚。 –

+0

@AndrewTomazos'void t'不會是一個臨時的(如果它是合法的)。 'void'是表達式的有效類型。例如對void函數的調用。 –

回答

8

下面的程序是否按照C++ 14標準形成了錯誤?

號如果您有想這可能是無效的一些具體的原因,你也許能夠獲得更詳細的答案,但在試圖引用標準的每一句話指出的那句話不會導致程序無效是不成效的。

如果不是,是唯一函數調用表達式包含在放棄值表達式中嗎?

唯一函數調用表達式的丟棄值表達式。

5.2.9靜態鑄造[expr.static.cast]

6任何表達式可以顯式轉換爲類型CVvoid,在這種情況下,它成爲一個丟棄值表達式(第5)。 [...]

我假設您已經知道如果可能,C風格的演員陣列會執行static_cast

+0

'[expr.static.cast]/6'就是我所追求的。謝謝你的幫助。 –