2017-07-18 36 views
1

考慮類別Foo其中foo是一個實例。這個關係不等於表達清晰嗎?

Foo有一個功能calculate(),該功能改變watermark()是「吸氣劑」的內部成員,並返回與該內部成員具有相同類型的東西。

是良好定義的表達

foo.calculate() != foo.watermark() 

。也就是說,在調用watermark()之前必須發生calculate()

爲了說話,是嚴格評估的順序foo.calculate(),其次是foo.watermark()其次是!=

+3

兩者之間沒有順序點,評估順序未指定。 – Jarod42

+0

清除[未定義的行爲和順序點]的副本(https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) –

回答

4

兩者之間沒有順序點,評估順序未指定。

你必須強制序列爲例如:

const auto& res = foo.calculate(); 
res != foo.watermark(); 
0

它可以幫助:幾乎所有的C++運算符(包括函數參數評價的一個函數調用的表達順序和子表達式的評價中的順序的操作數的評價http://en.cppreference.com/w/cpp/language/eval_order

訂單任何表達)是未指定的。編譯器可以按任何順序評估操作數,並且可以在再次評估同一個表達式時選擇另一個順序。

3

C++標準(ISO/IEC 14882:2014)說的:

之前測序的是不對稱的,傳遞,一對由單個線程執行的評估之間的關係爲 ,其在這些評估中誘導部分順序。給定任意兩個評估A和 B,如果A在B之前被排序,那麼A的執行應優先於 執行B. 如果A在B之前未被測序並且B不是在A之前測序的 ,則A和B沒有任何內容。評估A和 B在A在B之前測序或 B在A之前測序時未確定,但未指定哪一個。

不允許相同的標量對象出現在不確定序列或不確定序列操作的兩半中的副作用或值計算中。

參考鏈接here