SORU
29 Aralık 2013, Pazar


=C 11'de varsayılan yeni anahtar kelime

Neden bunu yapayım ki: anlamıyorum

struct S { 
    int a; 
    S(int aa) : a(aa) {} 
    S() = default; 
};

Neden sadece söylemek değil:

S() {} // instead of S() = default;

neden bunun için yeni bir kelime getirmek?

CEVAP
29 Aralık 2013, Pazar


Varsayılan bir varsayılan kurucu özellikle başlatma listesi ile kullanıcı tanımlı varsayılan olarak aynı yapıcı ve boş bileşik deyim olarak tanımlanır.

§12.1/6 [sınıf.decimal]Temerrüde ve silinmiş olarak tanımlanan varsayılan yapıcı örtülü olarak) kullanılan sınıf türünde bir nesne oluşturmak için zaman ya da açıkça ilk ilanından sonra temerrüde olduğunda tanımlanır. Örtülü olarak tanımlı varsayılan yapıcı gerçekleştirir kümesinin başlatmaları sınıfı olacağını gerçekleştirilen bir kullanıcı tarafından yazılmış bir varsayılan kurucu için bu sınıf ile decimal-başlatıcı (12.6.2) ve bir boş bileşik deyim. [...]

Her iki yapıcı davranır, ancak bununla birlikte, boş bir uygulama sağlayan sınıfının bazı özellikleri etkiler. Bir vererek yapar türü bir şey yok, olsa da tanımlı kullanıcı yapıcıtoplamave de değilönemsiz. Eğer sınıf toplama ya da önemsiz bir türü (veya geçişlilik, POD türü) olmak istiyorsanız, o zaman = default kullanmak gerekir.

§8.5.1/1 [Malzeme.ınit.aggr]Toplama bir dizi veya kullanıcı tarafından sağlanan kurucular hiç bir sınıf, [...]

§12.1/5 [sınıf.decimal]Varsayılan bir oluşturucu eğer kullanıcı tarafından sağlanan ise önemsiz değildir ve [...]

§9/6 [sınıf]Önemsiz bir sınıf önemsiz varsayılan bir oluşturucuya sahip bir sınıftır ve [...]

Göstermek için:

#include <type_traits>

struct X {
    X() = default;
};

struct Y {
    Y() { };
};

int main() {
    static_assert(std::is_trivial<X>::value, "X should be trivial");
    static_assert(std::is_pod<X>::value, "X should be POD");

    static_assert(!std::is_trivial<Y>::value, "Y should not be trivial");
    static_assert(!std::is_pod<Y>::value, "Y should not be POD");
}

Ayrıca, açıkça bir kurucu varsaymak örtülü yapıcı olurdu ki eğer örtülü yapıcı olurdu constexpr yapacak ve aynı zamanda aynı özel durum belirtimi verecektir. Durum verdiniz, örtülü yapıcı olmaz edilmiştir constexpr (çünkü bırak bir veri üyesi başlatılmamış) ve olur da boş bir özel durum belirtimi, bu yüzden fark yok. Ama evet, genel durum içinde elle constexpr ve özel durum belirtimi örtük yapıcı maç belirtebilirsiniz.

= default kullanılarak da hareket kurucular ve yıkıcılar kopyala/ile kullanılabilir, çünkü bazı tekdüzelik getirmek. Boş bir kopya yapıcı, örneğin, varsayılan bir kopyasını aynı kurucu üyelerinin üye bilge kopyasını yapmak). = default (= delete) sözdizimi düzgün bu özel üye işlevleri her biri için kullanarak kodunuzu açıkça niyetinizi belirterek okumayı kolaylaştırır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • Christopher Bill

    Christopher

    30 NİSAN 2009
  • tatermoog

    tatermoog

    2 AĞUSTOS 2006

İLGİLİ SORU / CEVAPLAR