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?

Visual Studio 2015 中的递归包含路径

Visual Studio 2015 中的打字稿

Bower 中的 Visual Studio 2015 还原包啥也不做

安装 SFML 后 Visual Studio 2015 中的错误

Visual Studio 2015/2017中的TSLint?