[英]Possible bug in handling the `default` keyword in VS2015 C++
在測試VS2015 C ++編譯器時,我偶然發現了一個帶有default
關鍵字的奇怪錯誤。 如果我做:
struct Dummy
{
Dummy() = default;
Dummy(const Dummy &) = delete;
};
int main()
{
const Dummy& ref = Dummy();
return 0;
}
我明白了
錯誤C2280:'Dummy :: Dummy(const Dummy&)':嘗試引用已刪除的函數
注意:看'Dummy :: Dummy'的聲明
但是如果我使用空構造函數
struct Dummy
{
Dummy() {}
Dummy(const Dummy &) = delete;
};
int main()
{
const Dummy& ref = Dummy();
return 0;
}
代碼編譯。 使用g ++或clang運行第一個示例不會產生錯誤。
為什么在VS2015中使用默認構造函數嘗試使用g ++或clang中沒有的復制構造函數?
這肯定是VS 2015中的一個錯誤。
在C ++ 11中,為const引用賦值臨時不能調用復制構造函數,但VS 2015會這樣做。
你可以檢查一下
#include <iostream>
struct Dummy
{
Dummy() = default;
Dummy(const Dummy &) { std::cout << "copy ctor" << std::endl; }
void test() const { std::cout << "test" << std::endl; }
};
int main()
{
const Dummy& ref = Dummy();
ref.test();
return 0;
}
在VS 2013,2015,gcc和clang上編輯。 如果類構造函數定義為= default
,則只有VS(任何版本)調用復制構造函數。
我認為VS compiiler仍然在2015年錯誤地使用舊的C ++ 03標准規則(C ++ 03的8.5.3.5):
如果初始化表達式是rvalue,T2是類類型,並且“cv1 T1”與“cv2 T2”引用兼容,則引用將以下列方式之一綁定(選擇是實現定義的):
- 引用綁定到由rvalue(參見3.10)表示的對象或該對象內的子對象。
- 創建臨時類型為“cv1 T2”[sic],並調用構造函數將整個右值對象復制到臨時對象中。 引用綁定到臨時或臨時內的子對象。
無論副本是否實際完成,用於制作副本的構造函數都應該是可調用的。
VS開發者選擇第二種方式。 他們為空的用戶定義的構造函數( {}
)更正了這個問題,但是忘了為默認的( = default
)構造函數執行此操作。
PS。 MS Connect上的錯誤 (請投票)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.