2015-12-10 30 views
2

在[expr.new]/7有以下短語:錯誤的表達

如果表達,轉換爲std::size_t之後,是一個核心 常量表達式和該表達是錯誤的,該程序是 不良形式。否則,帶有錯誤表達式 的新表達式不會調用分配函數,並會拋出類似 std::bad_array_new_length類型的處理程序(15.3)的類型的異常終止。

區分錯誤的核心常量表達式和錯誤的表達式有什麼相關性?

+1

我寧願得到一個編譯器錯誤,而不是'new int [-1]'上的異常,但編譯器不能檢查'new int [f()]'。 – aschepler

回答

6

您引用的段落之前的段落表達了在哪些條件下表達爲錯誤。基本上,這歸結於價值是否爲負數或太大的問題。如果是這樣,這是一個錯誤。

A 核心常量表達式是編譯器可以在編譯時計算出來的東西。如果相應的表達式因此可以被靜態地確定爲錯誤的,則這是編譯時錯誤。如果表達式不是常量,則在編譯期間可能無法確定其值。但是,在這種情況下,運行時會檢測到錯誤,並且錯誤必須導致異常。