Visual Studio 2013和2015中的C ++编译器错误C2280“试图引用已删除的函数”

亚历山德罗·贾科普森(Alessandro Jacopson)

在Visual Studio 2013(版本12.0.31101.00更新4)中,此代码段已编译,没有错误。

class A
{
public:
   A(){}
   A(A &&){}
};

int main(int, char*)
{
   A a;
   new A(a);
   return 0;
}

在Visual Studio 2015 RC(版本14.0.22823.1 D14REL)中因此错误而编译时:

1>------ Build started: Project: foo, Configuration: Debug Win32 ------
1>  foo.cpp
1>c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)': attempting to reference a deleted function
1>  c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我认为Visual Studio 2015附带的编译器会生成复制构造函数并将其标记为=delete,因此出现错误C2280(顺便说一下,我找不到msdn.microsoft.com上的文档)。

现在,假设我有一个可以与Visual Studio 2013一起编译的代码库(之所以可以工作,因为它依赖于编译器自动生成的代码),但是由于C2280而不能与Visual Studio 2015一起编译,我该如何解决此问题?

我当时在想以A这种方式声明课堂

class A
{
public:
   A(){}
   A(A &&){}
   A(const A&)=default;
};

我错过了什么吗?

巴里

在[class.copy] / 7中,重点是:

如果类定义未显式声明一个副本构造函数,则将隐式声明一个非显式的构造函数。如果类定义声明了move构造函数或move赋值运算符,则隐式声明的copy构造函数将定义为delete否则,将其定义为默认值(8.4)。如果该类具有用户声明的副本分配运算符或用户声明的析构函数,则不建议使用后一种情况。

在第18段中,有一个等效的部分用类似的措词来表示副本分配。因此,您的课程确实是:

class A
{
public:
   // explicit
   A(){}
   A(A &&){}

   // implicit
   A(const A&) = delete;
   A& operator=(const A&) = delete;
};

这就是为什么您不能复制构造它的原因。如果您提供了一个移动构造函数/赋值,并且您仍然希望该类是可复制的,则必须显式提供这些特殊的成员函数:

    A(const A&) = default;
    A& operator=(const A&) = default;

您还需要声明一个移动分配运算符。如果确实需要这些特殊功能,则可能还需要析构函数。五法则

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器错误C2280,尝试引用已删除的函数运算符=

与所有其他编译器一起使用的MSVC错误C2280(试图引用已删除的功能)

多级继承错误 C2280:“试图引用已删除的函数”

错误 C2280:Class::Class(void):试图引用已删除的函数

Visual Studio 2013中可能的C / C ++编译器错误

可能的Visual Studio 2015 C ++编译器和IntelliSense错误

也许是Visual Studio 2015中的C#编译器错误

Visual Studio 2015更新1中C ++的内部编译器错误

Visual Studio 2013中的C ++和Cuda速度

使用Visual Studio编译器分析内联的C ++函数

使用C和Visual Studio 2015的ANSI

Visual Studio 2015中的C代码错误

C ++中的数字溢出(Visual Studio 2013)

VIsual Studio 2013中C上的GUI

C ++ Visual Studio 2013编译错误?

什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

Visual Studio 2015更新3-C ++编译器错误?

如何防止输出屏幕在Visual Studio 2013 C ++编译器中消失

如何在Visual Studio 2015中使用roslyn C#编译器?

Visual Studio C ++参考删除的函数编译错误

Visual Studio 2013 C ++-准则

哪些编译器选项用于在Visual Studio中编译C ++ STL类/函数?

错误C2280:'QQmlPrivate :: QQmlElement <T> :: QQmlElement(void)':尝试引用已删除的函数

错误C2280:尝试引用已删除的函数(atomic <int>)

错误C2280:尝试引用已删除的函数(unique_ptr)

Visual Studio 2013和2015保存失败

在Visual Studio 2013中使用Roslyn编译器

Visual Studio 2015中的编译器是什么

无法在Visual Studio 2013中删除引用