[英]Lifetime of a temporary object bound to a reference member in member initializer list (C++14)
我在cppreference.com上查找一個臨時的生命周期,我發現C ++ 14發生了一些變化:
每當引用綁定到臨時或臨時的基礎子對象時,臨時的生命周期將擴展為與引用的生命周期匹配,但以下情況除外:
...
綁定到構造函數初始值設定項列表中的引用成員的臨時綁定僅在構造函數退出之前持續存在,而不是只要該對象存在。 (注意:從DR 1696開始這樣的初始化是不正確的)(直到C ++ 14)
我檢查了標准,真的沒有這樣的說法。 ($ 12.2 / 5臨時物品[class.temporary])
這是否意味着從C ++ 14開始,臨時綁定到引用成員的生命周期將擴展到對象的生命周期?
我嘗試了以下代碼與GCC和CLANG似乎都沒有,臨時將被構造函數結束時銷毀。
#include <iostream>
struct X {
~X() { std::cout << "X dtor\n"; }
};
struct Y {
Y() : x_(X()) { std::cout << "Y ctor\n"; }
const X& x_;
~Y() { std::cout << "Y dtor\n"; }
};
int main()
{
Y y;
std::cout << "Hello, world!\n";
}
結果:
Y ctor
X dtor
Hello, world!
Y dtor
我誤解了嗎?
您引用的缺陷報告已被采用,N4582已在[class.base.init]中包含新的措辭:
綁定到mem-initializer中的引用成員的臨時表達式格式不正確。 [例:
struct A { A() : v(42) { } // error const int& v; };
- 結束例子]
所以它沒有擴展到對象的生命周期 - 代碼只是格式不正確。 gcc和clang都會在我嘗試的每個版本上對你的代碼發出警告,我認為這符合要求,但理想情況下它們應該在那里出錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.