![](/img/trans.png)
[英]Problem while initializing reference variable of class through Member initialization list
[英]Initializing reference member variable with literal
在下面的代碼中,我用文字初始化一個引用變量。
class ABC
{
public:
const int& a;
ABC():a(43) { }
void newfoo()
{
printf("NEWFOO %d",a);
}
};
int main()
{
ABC obj;
obj.newfoo();
}
這個程序的輸出是NEWFOO 32767
,當我知道下面的代碼工作得很好時,這似乎是不合邏輯的。
int main()
{
const int& b=3;
printf("%d",b);
}
這里發生了什么? 如果編譯器在初始化引用變量期間聲明了一些臨時變量,那么該變量的范圍是不是在main中,因為該類在全局范圍內?
將創建一個臨時文件,並將引用綁定到該臨時文件(C ++ 03 8.5.3.5)。 臨時將在構造函數調用結束時銷毀,留下懸空引用。 這在C ++ 03 12.2.5中指定:
綁定到構造函數的ctor-initializer(12.6.2)中的引用成員的臨時綁定將持續存在,直到構造函數退出。
即使沒有任何標志, clang
也會為此代碼生成以下警告( 請參見實時 ):
warning: binding reference member 'a' to a temporary value [-Wdangling-field]
ABC():a(43) { }
^~
另一方面, gcc
需要-Wall
或-Wextra
。
如果我們檢查這個參考初始化參考它說:
綁定到構造函數初始值設定項列表中的引用成員的臨時綁定僅在構造函數退出之前持續存在,而不是只要該對象存在。
這可以在草案C ++標准第12.2
節臨時對象第5段中找到,其中包括以下項目符號
- 構造函數的ctor-initializer(12.6.2)中的引用成員的臨時綁定將持續存在,直到構造函數退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.