Compartir vía


Advertencia del compilador (nivel 4) C5267

La definición del operador de asignación o constructor de copia implícito para "type" está en desuso porque tiene un operador de asignación o constructor de copia proporcionado por el usuario

Comentarios

El estándar de C++ ha quedado en desuso (pero no se ha quitado) la generación implícita de operadores de copia y asignación en algunas condiciones. El compilador de MSVC sigue generando los operadores de copia y asignación en esas condiciones, pero puede cambiar su comportamiento en el futuro si el estándar quita el comportamiento en desuso. El propósito de esta advertencia es ayudar a probar el código en el futuro si el comité decide quitar esta funcionalidad.

Las secciones pertinentes del estándar de C++ son:

  • el párrafo 6 de class.copy.ctor, que dice: "Si la definición de clase no declara explícitamente un constructor de copia, se declara implícitamente una nonexplicit. Si la definición de clase declara un constructor de movimiento o un operador de asignación de movimiento, el constructor de copia declarado implícitamente se define como eliminado; de lo contrario, se usa de forma predeterminada. Este último caso está en desuso si la clase tiene un operador de asignación de copia declarado por el usuario o un destructor declarado por el usuario".
  • Anexo D.8, que dice: "La definición implícita de un constructor de copia como predeterminada está en desuso si la clase tiene un operador de asignación de copia declarado por el usuario o un destructor declarado por el usuario. La definición implícita de un operador de asignación de copia como predeterminada está en desuso si la clase tiene un constructor de copia declarado por el usuario o un destructor declarado por el usuario. Es posible que las versiones futuras de C++ especifiquen que se eliminen estas definiciones implícitas".

Ejemplo

El código siguiente muestra la advertencia C5267 cuando se llama a una función especial generada implícitamente, pero no se define explícitamente. Ambos /W4 y /w45267 son necesarios para generar esta advertencia.

// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
    CopyCtorOnly() = default;
    CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};

struct CopyAssignOpOnly
{
    CopyAssignOpOnly() = default;
    CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
    {
        return *this;
    }
};

int main()
{
    CopyCtorOnly a1, a2;
    a1 = a2; // Calls deprecated copy assignment operator

    CopyAssignOpOnly b1;
    CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}

Para resolver este problema, defina explícitamente el constructor de copia que falta o el operador de asignación de copia.

Consulte también

Funciones establecidas como valor predeterminado y eliminadas explícitamente