Visual Studio 2015 中的“无法引用默认构造函数”
Posted
技术标签:
【中文标题】Visual Studio 2015 中的“无法引用默认构造函数”【英文标题】:"default constructor cannot be referenced" in Visual Studio 2015 【发布时间】:2015-11-29 00:51:54 【问题描述】:我在 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 中的错误?
更新
根据此处的 cmets 和答案,我在 Microsoft Connect 上打开了 bug report。
【问题讨论】:
它可以编译,对吧?我不会担心 IntelliSense 错误。它有时会感到困惑并错误地报告问题。 这是(Intellisense in)Visual Studio 中的一个错误。所有 Visual Studio 错误都是真实的。 AFAIK。 Intellisense 不使用与编译器相同的分析机制。不过,这种情况将来可能会改变。 我觉得我们每周都会在 SO 上看到一些 Intellisense 错误。 感觉我们需要一个规范的问题来解决这个问题,但不确定如何构建它。 【参考方案1】:这是一个智能感知错误。 clang 和 gcc 都接受这个代码,webcompiler an online Visual c++ compiler accepts this code。
草案 C++14 标准部分 12.1
[class.ctor] 说,如果:
X 是一个类似联合的类,它有一个变体成员和一个重要的默认构造函数, 任何没有大括号或等号初始化器的非静态数据成员都是引用类型, 任何没有大括号或相等初始化器的 const 限定类型(或其数组)的非变体非静态数据成员都没有 用户提供的默认构造函数, X 是一个联合,它的所有变体成员都是 const 限定类型(或其数组), X 是一个非联合类,任何匿名联合成员的所有成员都是 const 限定类型(或其数组), 任何可能构造的子对象,除了带有大括号或等号初始化器的非静态数据成员,都具有类类型 M(或数组 其中)并且 M 没有默认构造函数或重载 应用于 M 的默认构造函数的分辨率 (13.3) 会导致 模棱两可或在功能中被删除或无法访问 默认的默认构造函数,或 任何可能构造的子对象都有一个带有析构函数的类型,该析构函数已从默认默认值中删除或不可访问 构造函数。
这里都不适用。
更新
在bug report filed by the OP 中,回复是:
感谢您报告此问题。修复应该在 Visual Studio 2015 的下一次更新中可用。
【讨论】:
你知道cl
(Visual Studio 使用的实际 C++ 编译器)是否接受代码?这对 VS 用户来说比 gcc 和 clang 更相关。
@BenVoigt webcompiler accepts the code 不幸的是,我无法建立实时链接。我希望他们能添加它,其余的都可以让您创建实时链接,这是一个有用的功能。
无法弄清楚 Visual Studio 为何不高兴,但我将私有数据成员声明为 Const。将 Const 字段移至全局范围解决了问题
是的,从类中的变量中删除 const 以某种方式解决了这个问题以上是关于Visual Studio 2015 中的“无法引用默认构造函数”的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2015/2017 中的 TSLint?
Bower 中的 Visual Studio 2015 还原包啥也不做