2016-06-07 43 views
3

有人可以引用C++標準的相應段落,其中說明std::string構造和foo()調用的順序在以下情況下未指定:X().Y(Z())和標準中的評估順序

std::string().append(foo()); 

我知道,有5.2.2.8但它指出以下關於函數參數,而不是幾個功能相同的序列點之間來電:

的函數參數評價的順序是不確定的

+1

[5.2.2.5](http://eel.is/c++draft/expr.post#expr.call-4)「如果函數是一個非靜態成員函數,函數的這個參數([class.this])應該使用指向調用對象的指針進行初始化,如同通過顯式類型轉換([expr.cast])進行轉換。「似乎表明它被認爲是函數隱含的'this'參數的來源,但是我不會把錢放在我的閱讀上是正確的,因爲我沒有完全閱讀這部分標準。 – jaggedSpire

回答

3

5/4 [EXPR]:

除非另有說明,個體經營者和單個表達式的子表達式,並且其中的副作用發生的順序的操作數的計算順序,是不確定的

由於操作員是功能,這意味着string()將在foo()之前或之後構建。

另見:Order of function call

「了Bjarne Stroustrup的也表示明確的‘C++程序設計語言’第3版第6.2.2節,一些推理:

更好的代碼,可以在生成的。不存在對錶達式求值順序限制

另見:Order of evaluation in C++ function parameters

+2

這裏的「操作員」是什麼意思? 'operator.'? – FrozenHeart

+0

不,像'operator +'對不起,不明確... (雖然'operator.'也被分類爲函數。) –

8

人們普遍認爲,將表達式評估順序置於未定義狀態會導致更多的優化。這在10年和20年前可能是真的,但似乎並沒有這麼多。爲此提供的數據已提交給委員會,但我不知道它是否在任何地方發佈。