Home >Backend Development >C++ >Why Does Visual Studio 2015 Throw Error C2280 \'attempting to reference a deleted function\' When Compiling Code That Works in Visual Studio 2013?

Why Does Visual Studio 2015 Throw Error C2280 \'attempting to reference a deleted function\' When Compiling Code That Works in Visual Studio 2013?

Barbara Streisand
Barbara StreisandOriginal
2024-10-27 04:00:29854browse

Why Does Visual Studio 2015 Throw Error C2280

C Compiler Error C2280 "attempting to reference a deleted function" in Visual Studio 2013 and 2015

The C compiler in Microsoft Visual Studio 2013 and 2015 handles copy constructors and assignment operators differently.

Visual Studio 2013

If a copy constructor or move assignment operator is not explicitly declared in the class definition, the compiler will implicitly generate them.

Visual Studio 2015

However, in Visual Studio 2015, if a class definition includes a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted.

Problem Statement

The following code compiles successfully in Visual Studio 2013 but generates error C2280 in Visual Studio 2015:

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

int main(int, char*)
{
   A a;
   new A(a);
   return 0;
}</code>

C2280: 'A::A(const A &)' attempting to reference a deleted function

Resolution

To fix this error in Visual Studio 2015, one needs to explicitly declare the copy constructor and move assignment operator, or use the default constructor:

Option 1: Explicitly Declare Copy Constructor and Move Assignment Operator

<code class="cpp">class A
{
public:
   A(){}
   A(A &&&) {}
   A(const A&) = default; // Default copy constructor
   A& operator=(const A&) = default; // Default move assignment operator
};</code>

Option 2: Define Class as Deleted or Incomplete

<code class="cpp">class A
{
public:
   A(){}
   A(A &&&) = delete; // Mark copy constructor as deleted

   A(const A&); // Incomplete constructor (cannot be instantiated)
   A& operator=(const A&); // Incomplete assignment operator (cannot be instantiated)
};</code>

The above is the detailed content of Why Does Visual Studio 2015 Throw Error C2280 \'attempting to reference a deleted function\' When Compiling Code That Works in Visual Studio 2013?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn