Visual Studio 2015中“无法引用默认构造函数”

时间:2015-11-29 00:51:55

标签: c++ c++11 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;
}

在Clang上编译没有任何问题。但Visual Studio 2015 IntelliSense提供以下错误消息:

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

我在代码中遗漏了什么,或者这是Visual Studio中的错误?

更新

根据这里的评论和答案,我在Microsoft Connect上打开了bug report

1 个答案:

答案 0 :(得分:8)

这是一个Intellisense错误。 clang和gcc都接受此代码,webcompiler an online Visual c++ compiler accepts this code

草案C ++ 14标准部分12.1 [class.ctor] 表示在以下情况下删除类的默认默认构造函数:

  
      
  • X是一个类似联合的类,其变体成员具有非平凡的默认构造函数,
  •   
  • 任何没有大括号或等号初始化程序的非静态数据成员都是引用类型
  •   
  • 任何const-qualified类型(或其数组)的非变量非静态数据成员,没有brace-orequal-initializer,没有   用户提供的默认构造函数,
  •   
  • X是一个联合,其所有变体成员都是const限定类型(或其数组),
  •   
  • X是一个非联合类,任何匿名联合成员的所有成员都是const限定类型(或其数组),
  •   
  • 任何可能构造的子对象,除了具有大括号或者大小为正整数的非静态数据成员外,都具有类型M(或数组)   M)没有默认构造函数或重载   应用于M的默认构造函数的分辨率(13.3)导致a   歧义或在被删除或无法访问的函数中   默认的默认构造函数,或
  •   
  • 任何可能构造的子对象都有一个带有析构函数的类型,该类型从默认默认值中删除或无法访问   构造
  •   

这里没有一个适用。

更新

bug report filed by the OP中,回复是:

  

感谢您报告此问题。修复程序应在Visual Studio 2015的下一次更新中提供。