首页 > 后端开发 > C++ > 正文

为什么我在 Visual Studio 中收到编译器错误 C2280:'尝试引用已删除的函数”?

Linda Hamilton
发布: 2024-10-27 10:31:03
原创
396 人浏览过

Why Am I Getting Compiler Error C2280:

编译器错误 C2280:在 Visual Studio 中解决“尝试引用已删除的函数”

问题

Visual Studio 2013 编译以下代码片段没有错误:

<code class="cpp">class A {
public:
   A(){}
   A(A &amp;&amp;){}
};

int main(int, char*) {
   A a;
   new A(a);
   return 0;
}</code>
登录后复制

但是,Visual Studio 2015 RC 遇到错误 C2280:

1>c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &amp;)': attempting to reference a deleted function
1>  c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
登录后复制

原因

在 C 11 中,如果类定义没有显式声明复制构造函数,编译器隐式生成一个。但是,如果类定义了移动构造函数或移动赋值运算符,但没有同时提供显式复制构造函数,则隐式复制构造函数将定义为 =delete。这是为了强制执行“五规则”,防止在不同基类和派生类之间复制对象时出现无意的切片。

解决方案

要解决 C2280 错误,您必须显式声明复制构造函数,如果你希望该类是可复制的。这里有两个选项:

  1. 显式定义和删除复制构造函数

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = delete;
    };</code>
    登录后复制
  2. 显式提供并默认复制构造函数

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = default;
       A&amp; operator=(const A&amp;) = default;
    };</code>
    登录后复制

在第二种方法中,您还需要显式提供移动赋值运算符,并考虑声明析构函数以遵循规则五个。

以上是为什么我在 Visual Studio 中收到编译器错误 C2280:'尝试引用已删除的函数”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!