2015-11-29 83 views
8

我在Visual Studio 2015年以下剝奪了代碼面臨一個非常奇怪的錯誤消息:「默認構造函數不能引用」在Visual Studio 2015年

struct A 
{ 
    A(int val = 0) 
    : 
     x(val) 
    {} 

    int x = 0; 
}; 

struct B: A 
{ 
    static int y; 
}; 

int B::y = 1; 

struct C: B 
{ 

}; 

int main() 
{ 
    C c; 
    return 0; 
} 

編譯沒有上鏘任何問題。但是Visual Studio的智能感知2015年提供了以下錯誤信息:

the default constructor of "C" cannot be referenced -- it is a deleted function 

我失去了我的代碼的東西,或者這是在Visual Studio中的錯誤?


UPDATE

基礎上的評論和答案在這裏,我已經打開微軟連接bug report

+3

它雖然編譯,對不對?我不擔心智能感知錯誤。它有時會感到困惑,並錯誤地報告問題。 –

+1

這是(Visual Studio中的)Intellisense中的一個錯誤。所有的Visual Studio錯誤都是真的。據我所知。智能感知不使用與編譯器相同的分析機器。不過,這可能會在未來發生變化。 –

+0

我覺得我們在SO上每週都會看到一些Intellisense的bug。 –

回答

7

這是一個Intellisense錯誤。 clang和gcc都接受這個代碼,也是webcompiler an online Visual c++ compiler accepts this code

的C++草案標準14部分12.1[class.ctor]說一類一個默認的默認的構造被刪除,如果:

  • X是具有一個聯合狀類變體構件具有非平凡缺省構造,
  • 沒有大括號或相等的初始值設定任何非靜態數據成員是參考的類型,
  • const限定類型的任何非變異非靜態數據成員(或其陣列)沒有支撐-orequal-初始化不具有 用戶提供的默認的構造,
  • X是聯合及其所有變體成員都是常量限定類型(或其陣列)的,
  • X是不癒合類並且任何匿名聯合成員的所有成員都是const限定類型(或其數組),
  • 任何可能構造的子對象,除了帶有括號或等於初始化程序的非靜態數據成員,都具有類類型M(或數組 ),並且M沒有默認構造函數或過載 分辨率(13.3)適用於M的默認構造函數導致 含糊不清或在從0中刪除或不可訪問的函數中默認默認構造函數或
  • 任何可能構造的子對象都具有一個類型,其中的析構函數已從默認的默認構造函數中刪除或無法訪問。

這裏都不適用。

更新

bug report filed by the OP的反應是:

感謝您報告此問題。 Fix應該在Visual Studio 2015的下一次更新中可用。

+0

你知道'cl'(Visual Studio使用的實際C++編譯器)是否接受代碼?這對VS用戶來說比gcc和clang更有意義。 –

+1

@BenVoigt [web編譯器接受代碼](http://webcompiler.cloudapp.net/)不幸的是我不能做一個實時鏈接。我希望他們能夠添加它,其他所有人都可以讓你創建實時鏈接,這是一個有用的功能。 –

+0

無法弄清楚爲什麼Visual Studio不高興,但我宣佈私人數據成員爲Const。將常量字段移至全局範圍解決了問題 – Luminaire