【问题标题】:"default constructor cannot be referenced" in Visual Studio 2015Visual 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 错误。
  • 感觉我们需要一个规范的问题来解决这个问题,但不确定如何构建它。

标签: c++ c++11 visual-studio-2015


【解决方案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 以某种方式解决了这个问题
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 2014-06-23
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2014-12-22
  • 2017-11-02
  • 2018-03-09
相关资源
最近更新 更多