Aracılığıyla paylaş


Derleyici uyarısı (düzey 4) C5267

'type' için örtük kopya oluşturucu/atama işlecinin tanımı, kullanıcı tarafından sağlanan atama işleci/kopya oluşturucusu olduğundan kullanım dışı bırakıldı

Açıklamalar

C++ Standardı, bazı koşullar altında örtük kopyalama ve atama işleçleri oluşturma işlemini kullanım dışı bırakılmıştır (ancak kaldırmadı). MSVC derleyicisi yine bu koşullar altında kopyalama ve atama işleçlerini oluşturur, ancak standart kullanım dışı bırakılan davranışı kaldırırsa gelecekte davranışını değiştirebilir. Bu uyarının amacı, komite bu işlevselliği kaldırmaya karar verirse kodunuzun gelecekte kanıtını sağlamaya yardımcı olmaktır.

C++ standardının ilgili bölümleri şunlardır:

  • class.copy.ctor paragraf 6, şöyle ifade eder: "Sınıf tanımı açıkça bir kopya oluşturucu bildirmezse, yok bir örtük olarak bildirilir. Sınıf tanımı bir taşıma oluşturucu veya taşıma atama işleci bildirirse, örtük olarak bildirilen kopya oluşturucu silinmiş olarak tanımlanır; aksi takdirde, varsayılan olarak ayarlanır. Sınıfın kullanıcı tarafından bildirilen bir kopya atama işleci veya kullanıcı tarafından bildirilen bir yıkıcısı varsa ikinci durum kullanım dışıdır."
  • Ek D.8, şu ifadeyi verir: "Bir kopya oluşturucunun varsayılan olarak örtük tanımı, sınıfın kullanıcı tarafından bildirilen bir kopya atama işleci veya kullanıcı tarafından bildirilen bir yıkıcısı varsa kullanım dışıdır. Varsayılan olarak kopya atama işlecinin örtük tanımı, sınıfın kullanıcı tarafından bildirilen bir kopya oluşturucusu veya kullanıcı tarafından bildirilen bir yıkıcısı varsa kullanım dışı bırakılır. C++ uygulamasının gelecekteki sürümleri bu örtük tanımların silindiğini belirtebilir."

Örnek

Aşağıdaki kod, örtük olarak oluşturulan özel bir işlev çağrıldığında ancak açıkça tanımlanmadığında C5267 uyarısını gösterir. Hem hem /w45267 de /W4 bu uyarıyı üretmek için gereklidir.

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

Bu sorunu çözmek için eksik kopya oluşturucuyu veya kopyalama atama işlecini açıkça tanımlayın.

Ayrıca bkz.

Açıkça Varsayılan Haline Getirilen ve Silinen İşlevler