2018年6月26日

[C++] prvalue sucks!

最近在看 YouTube 上的這部影片解釋 object, lifetime 還有 reference 相關的內容,裡面有個有個關於 prvalue 的範例讓我有點驚訝,驚訝地點在於 C++ standard 對於標準有定義的型態 (像是 primitive type) 跟未定義的型態 (像是 struct 或是 class) 有完全不一樣的行為,但為什麼會這樣定義卻想不通 = =

先來看看甚麼是 prvalue 好了,C++ reference 上的定義是這樣寫的:
a prvalue (“pure” rvalue) is an expression whose evaluation either
  • computes the value of the operand of an operator (such prvalue has no result object), or
  • initializes an object or a bit-field (such prvalue is said to have a result object). All class and array prvalues have a result object even if it is discarded. In certain contexts, temporary materialization occurs to create a temporary as the result object;
簡單來說就是在運算過程中產生的暫時性物件,不是經由使用者利用 move semantic 的弄出來的 rvalue (比方說 rvalue reference 的物件)

好,這東西的問題是在於我在上面提到的那部影片中看到這個範例,結果會完全相反呢!簡單來說如果今天 prvalueobject 的型態是使用者自定義型別,那什麼事都不會發生;反之,如果是 primitive type 這種已經定義在標準中的型態,它會自動轉變成 non-const 的型別,然後...當然會挑到完全不同的 overloading function

找個機會應該可以來試一下 STL 中的型別會發生什麼事,影片中是說標準裡面有沒有定義的型別,不曉得有沒有擴及到 STL,還是只有 primitive type 會這樣。然後還要看看能不能找到 C++ standard 的原文。

沒有留言:

張貼留言