2015-11-29 166 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