Condividi tramite


Avviso C26432

If you define or delete any default operation in the type 'type-name', define or delete them all (c.21).

Linee guida di base per C++:
C.21: Se si definisce o =eliminare qualsiasi operazione predefinita, definire o =eliminarle tutte

Si presuppone che operazioni speciali, ad esempio i costruttori, modifichino il comportamento dei tipi in modo che si basano più su meccanismi di linguaggio per applicare automaticamente scenari specifici. L'esempio canonico è la gestione delle risorse. Se si definisce in modo esplicito, predefinito o si elimina una di queste operazioni speciali, segnala di voler evitare una gestione speciale di un tipo. È incoerente lasciare non specificate le altre operazioni, ovvero definite in modo implicito come eliminate dal compilatore.

Osservazioni:

Questo controllo implementa la regola di cinque, che considera le operazioni seguenti come speciali:

  • costruttori di copia,
  • costruttore di spostamento,
  • operatori di assegnazione di copia,
  • spostare gli operatori di assegnazione e
  • Distruttori.

La regola non controlla se le operazioni sono definite nello stesso modo. È possibile combinare operazioni eliminate e predefinite con quelle definite in modo esplicito. Tuttavia, è necessario specificare tutti se si specifica uno di essi.

I livelli di accesso non sono importanti e possono anche essere misti.

L'avviso contrassegna la prima definizione di funzione non statica di un tipo, una volta per tipo.

Esempio

In questo esempio definisce warning::S solo un costruttore predefinito e un distruttore. La no_warning::S dichiarazione definisce o elimina tutte e cinque le funzioni membro speciali.

// C26432.cpp
namespace warning
{
    struct S
    {
        S() noexcept { ++_count; }
        ~S() { --_count; } // C26432 because only the constructor and destructor are explicitly defined.
        static unsigned _count;
    };
    unsigned S::_count = 0;
}

namespace no_warning
{
    struct S
    {
        S() noexcept { _count++;  }
        S(const S&) = delete;
        S(S&&) = delete;
        S& operator=(const S&) = delete;
        S& operator=(S&&) = delete;
        ~S() { --_count; }
        static unsigned _count;
    };
    unsigned S::_count = 0;
}