簡體   English   中英

使用 std::tie() 和賦值的評估順序

[英]Evaluation order with std::tie() and assignment

以下內容有效嗎?

template <typename T>
std::pair<T, T> foo(T one, T two) { ... }

std::tie(one, two) = foo(std::move(one), std::move(two));

(假設所涉及的類以有效的方式處理分配給從 object 移動的對象)。


通過閱讀更新后的評估訂單提案,我的假設是這是固定的,但我無法在標准中找到驗證這一點的確切參考。 有人可以幫忙提供嗎?

標准中的相關部分可以在[expr.ass]/1中找到,它有

在所有情況下,賦值都在左右操作數的值計算之后和賦值表達式的值計算之前進行排序。 右操作數在左操作數之前排序。 對於不確定順序的 function 調用,復合賦值的操作是單次評估。

所以,據此, foo(std::move(one), std::move(two)); 將首先被評估,一旦std::tie(one, two)被評估,就會將onetwo從對象中移出。 tie創建引用,因此無法訪問從那里移動的對象。 然后分配實際上發生意味着通過std::tuple::operator =分配onetwo並獲得foo返回的任何值。 這是合法且定義明確的。

無論 C++17 更改為=的評估順序,該代碼都是有效的。

由於 LHS 不會從onetwo讀取,而只是獲取它們的地址,因此相對於 RHS 未排序(C++17 之前)不會導致 UB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM