簡體   English   中英

提供用戶定義的移動構造函數時,Visual Studio 2013不會刪除副本構造函數

[英]Visual Studio 2013 does not delete the copy constructor when a user-defined move constructor is provided

我感謝C ++ 11標准規定:

如果類定義未明確聲明一個副本構造函數,則將隱式聲明一個副本構造函數。 如果類定義聲明了move構造函數或move賦值運算符,則隱式聲明的copy構造函數定義為delete 否則,將其定義為默認值。

(實際上是從此處復制)

如下代碼:

#include <iostream>

struct C
{
    int x = 1;

    C()
    {
    }

    C(C&&)
    {
    }
};

int main()
{
    const C c;
    C c2(c);

    std::cout << c.x << " " << c2.x << std::endl;

    return 0;
}

不能在gcc 4.9.0gcc 4.9.0 ,但可以在Visual Studio 2013上正常Compiler Version 18.00.21005.1 for x86Compiler Version 18.00.21005.1 for x86 )。 這是Visual Studio又一次違反標准嗎,還是這次我做錯了什么? 如果這違反了標准,是否存在跟蹤錯誤或記錄此行為的任何來源?

您沒有做錯任何事情,並且您對該標准的解釋是正確的。 Visual C ++ 2013確實無法正確實現這些規則。

相關的錯誤報告在這里:

即使定義了自定義移動構造函數,也會生成默認的復制構造函數[c ++ 11]

標記為Won't Fix ,開發團隊的評論是:

實際上,Visual Studio 2013並未完全實現用於管理特殊成員函數和移動操作的C ++ 11規則。 我們將在Visual Studio的下一個主要版本中包含針對此錯誤的修復程序。

好消息是,Visual C ++ 2015 RC中似乎一切正常。 我剛剛驗證了您的代碼會觸發編譯器和IntelliSense錯誤。 編譯器診斷為:

error C2280: 'C::C(const C &)': attempting to reference a deleted function

(根據我過去幾個月的測試,MSVC14正逐漸成為一個非常不錯的C ++編譯器-已解決了許多標准合規性問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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