我在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。
答案 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的下一次更新中提供。