2015-05-20 52 views
5

雖然在維基百科上查找運算符關聯性,但我注意到delete具有從右到左的關聯性。源被引用爲msdn,我檢查了它,它屬於第3組優先級,從右到左的關聯性。所以,我檢查the C++ standard (n4296)運算符刪除關聯

5.3元表達式[expr.unary]

1)表達式與一元運算符組從右到左

unary-expression: 
    postfix-expression 
    ++ cast-expression 
    -- cast-expression 
    unary-operator cast-expression 
    sizeof unary-expression 
    sizeof (type-id) 
    sizeof ... (identifier) 
    alignof (type-id) 
    noexcept-expression 
    new-expression 
    delete-expression 
unary-operator: one of 
    * & + - ! ~ 

,這都意味着什麼? delete究竟有什麼關聯性?

+1

delete * ++ x;如果你在你想刪除的指針前有一個指向指針的指針呢? (從MickLH偷來) – Almo

回答

6

正如Barry所說,優先級取決於語法(並且有一些運算符與優先級的基本思想不太吻合,因此您只能真正弄清楚從語法中完全正確地發生了什麼,而不是優先表)。

即使我們忽略了這一點,但是,只有刪除的優先級(至少通常)決定一個語句是合法/允許的,而不是它的意思。爲了給出反例,用+*,優先級確定2 * 3 + 4產生10而不是14(即乘法優先)。

delete的情況下,由於delete語句而沒有生成任何值,因此不允許使用像delete x + y;這樣的語句。它將被解析爲(delete x) + y;,但由於delete x不會產生可添加到其他任何值的值,因此結果總是被禁止的(並且如果您更改了運算符,那將保持爲真)。

相關性對delete沒有意義。特別是,關聯性處理是否類似於:a @ b @ c將被解析爲(a @ b) @ ca @ (b @ c)(其中@是某個運算符)。對於採用兩個操作數的操作符來說,這只是非常有意義的。根本沒有辦法結合delete以允許您提問關聯性答案的問題。

+0

這就是我的想法;它只是沒有意義,它具有相關性!我想知道我是否錯過了一些可以使用它的東西。 – OMGtechy

2

C++標準通常不會根據優先級或關聯性來定義運算符。它用語法來定義它們。從[expr.delete],delete使用刪除表達其被定義爲:

刪除表達
        ::選擇delete鑄表達
        :: opt delete []cast-expression

鑄表達在[expr.cast]被定義:

鑄表達:
        一元表達式
        (type-id)鑄表達

而且一元表達式是一大堆定義[expr.unary]事項外,都是一元表達式(遞增,遞減,deleteš本身)

也就是說,delete *x是右向左關聯,因爲(delete (*x))是根據語法解析該表達式的唯一方法。

這也是cppreference引用delete的優先順序的原因,因爲它是直接的結果。例如,delete高於+因爲在像這樣的表達式:

delete x+y 

x+y不是一元表達式,因此語法的唯一合法解析將(delete x) + y

+2

優先與聯繫性無關。 –

+0

我剛剛在標準中發現它,請參閱更新 – OMGtechy

1

聯繫是關於是否a op b op c被解析爲(a op b) op ca op (b op c)

delete是一元運算符,因此它無法關聯。它沒有關聯性。

delete delete x永遠無效。