簡體   English   中英

處理VS2015 C ++中的`default`關鍵字可能存在錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM