Partager via


Avertissement C26432

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

Recommandations principales en C++ :
C.21 : Si vous définissez ou =supprimez une opération par défaut, définissez ou =supprimez-les tous

Les opérations spéciales telles que les constructeurs sont supposées modifier le comportement des types afin qu’elles s’appuient davantage sur les mécanismes de langage pour appliquer automatiquement des scénarios spécifiques. L’exemple canonique est la gestion des ressources. Si vous définissez explicitement, par défaut ou supprimez l’une de ces opérations spéciales, il signale que vous souhaitez éviter toute gestion spéciale d’un type. Il est incohérent de laisser les autres opérations non spécifiées, c’est-à-dire implicitement définies comme supprimées par le compilateur.

Notes

Cette vérification implémente la règle de cinq, qui traite les opérations suivantes comme spéciales :

  • constructeurs de copie,
  • constructeurs de déplacement,
  • opérateurs d’affectation de copie,
  • opérateurs d’affectation de déplacement et
  • Destructeurs.

La règle ne vérifie pas si les opérations sont définies de la même façon. Il est possible de mélanger les opérations supprimées et par défaut avec des opérations définies explicitement. Toutefois, vous devez tous les spécifier si vous spécifiez l’un d’eux.

Les niveaux d’accès ne sont pas importants et peuvent également être mélangés.

L’avertissement signale la première définition de fonction non statique d’un type, une fois par type.

Exemple

Dans cet exemple, warning::S définit uniquement un constructeur par défaut et un destructeur. La no_warning::S déclaration définit ou supprime les cinq fonctions membres spéciales.

// 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;
}