Aracılığıyla paylaş


Uyarı C26432

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

C++ Temel Yönergeleri:
C.21: Herhangi bir varsayılan işlemi tanımlar veya =silerseniz, bunları tanımlayın veya =silin

Oluşturucular gibi özel işlemlerin türlerin davranışını değiştirdiği varsayılır, böylece belirli senaryoları otomatik olarak uygulamak için dil mekanizmalarına daha fazla güvenirler. Kurallı örnek, kaynak yönetimidir. Bu özel işlemlerden herhangi birini açıkça tanımlar, varsayılan olarak belirler veya silerseniz, bir türün özel işlenmesini önlemek istediğinize işaret eder. Diğer işlemlerin belirtilmemiş, yani örtük olarak derleyici tarafından silinmiş olarak tanımlanması tutarsız.

Açıklamalar

Bu denetim, aşağıdaki işlemleri özel olarak değerlendiren beş kuralını uygular:

  • kopya oluşturucuları,
  • oluşturucuları taşıma,
  • kopyalama atama işleçleri,
  • atama işleçlerini taşıma ve
  • Yıkıcı.

Kural, işlemlerin aynı şekilde tanımlandığını denetlemez. Silinen ve varsayılan işlemleri açıkça tanımlanmış işlemlerle karıştırmak sorun değildir. Ancak, herhangi birini belirtirseniz bunların tümünü belirtmeniz gerekir.

Erişim düzeyleri önemli değildir ve karıştırılabilir.

Uyarı, türün ilk statik olmayan işlev tanımını her türe bir kez bayrak ekler.

Örnek

Bu örnekte, warning::S yalnızca bir varsayılan oluşturucu ve bir yıkıcı tanımlar. Bildirimi, no_warning::S beş özel üye işlevinin tümünü tanımlar veya siler.

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