我正在讀FDIS(12.2p {4,5})的這兩段:當一個數組由子表達式創建時,其中的臨時對象會發生什麼?
有兩個上下文,其中的臨時被在不同的點比全表達的端部銷燬。第一個上下文是當調用默認構造函數來初始化數組的元素時。如果構造函數有一個或多個默認參數,則在構造下一個數組元素(如果有)之前,對在默認參數中創建的每個臨時對象的銷燬都進行排序。
和
的第二上下文是當引用綁定到一個暫時的。臨時到該參考結合或臨時即其上結合的參考持續基準的壽命除了一個子對象的完整的對象: [...]
- 臨時結合到函數調用(5.2.2)中的引用參數將一直存在,直到完成包含調用的完整表達式。
這兩個2似乎與以下情況
struct A {
A() { std::cout << "C" << std::endl; }
~A() { std::cout << "D" << std::endl; }
};
struct B {
B(A const& a = A()) { }
};
typedef B array[2];
int main() {
array{};
}
將所要求的第一上下文此輸出CDCD
,或將所要求的第二上下文此輸出CCDD
? GCC似乎遵循第二個上下文描述並輸出CCDD
。我忽略了一些重要的東西嗎?
編輯:我不認爲它需要C++ 0x。這new
-expression是我的問題太受影響:
new array(); /* CDCD or CCDD ?? */
在這種情況下,雖然,GCC遵循第一上下文和輸出CDCD
。
報道,希望它的一些GCC開發者評論:http://gcc.gnu.org/bugzilla/show_bug.cgi?id= 49372 – 2011-06-11 13:47:16
奇怪:我的GCC 4.6沒有輸出。 - 啊,我看你有相同的看似錯誤的行爲:)對於它的價值:MSVS2010 SP1輸出CDCD ... – rubenvb 2011-06-11 13:49:06
另外:8.5.4/4似乎暗示有*正常*沒有序列約束的論點一個電話。在這裏有關係,因爲GCC中的'new array()'情況打印了'CDCD'? – rubenvb 2011-06-11 14:12:27