(由an answer提示。)什麼是decltype(0 + 0)?
鑑於N3290,§7.1.6.2p4,這裏的列表項是無編號,但編號在這裏爲我們的方便:
通過decltype表示的類型(E )被定義爲如下:
- 如果e是一個括號的ID-表達或加括號的類的成員訪問(5.2.5),decltype(e)是通過e命名實體的類型。如果沒有這樣的實體,或者如果e名稱是一組重載函數,則該程序是不合格的;如果e是x值,則decltype(e)是T & &,其中T是e的類型;否則,如果e是左值,則decltype(e)是T &,其中T是e的類型;如果e是左值,則decltype(e)是T &,其中T是e的類型;
- 否則,decltype(e)是e的類型。
decltype(0 + 0)指定的類型是什麼?
第1項不適用,2可能,但如果不適用,則3不適用,4將是結果。那麼,什麼是xvalue,是0 + 0還是xvalue?
§3.10p1:
的x值(一個「到期」值)也指一個對象,通常接近其壽命的末尾(使得其資源可以被移動,例如)。 xvalue是涉及右值引用的某些表達式的結果(8.3.2)。
我沒有在§8.3.2中看到任何有用的東西,但我知道「0 + 0」不涉及任何右值引用。文字0是一個prvalue,它是「不是一個xvalue的右值」(§3.10p1)。我相信「0 + 0」也是一個價值。如果是這樣,「decltype(0 + 0)」將是int(不是int & &)。
我錯過了我的解釋?這段代碼是否合格?
decltype(0 + 0) x; // Not initialized.
代碼在GCC 4.7.0 20110427和Clang 2.9(中繼線126116)上編譯。例如,如果decltype指定了一個int & &類型,那麼它將不會完好。
我沒有看到你的推理有什麼問題。我相信'decltype(0 + 0)'也應該是'int'。 – 2011-05-08 00:36:00
FWIW,肯定的一個好的答案是擴展xvalue的定義並展示它的可能和不可能。 (我會發現*非常有用)。我需要看看如何重新說明,關注「什麼是xvalue?」同時仍然考慮這個「0 + 0」的具體情況。 – 2011-05-08 00:43:00
雖然最新的草案確實爲很多表達式指定了_value category_,包括後綴增量和3.10中的一個註釋,表明第5條應該顯示每個內置操作符的值的類別,但似乎沒有提到草案任何二元運算符的值類別從5.6到5.15,除非我的搜索能力讓我失敗。 – 2011-05-08 00:58:33