2015-02-08 7 views
5

Visual C++ 2013 kullanıyorum. Sınıf bir toplam olduğunda sıfır başlatıldı. Toplama olmadığı zaman, varsayılan olarak başlatılmış ve belirsiz bırakılmış gibi görünüyor. Neden?C++ 14 Bir Toplama Sırasındaki Tekdüzen Başlatma

#include <iostream> 

using namespace std; 

class Test_1 
{ 
public: 
    int i; 
    void f(){}; 
}; 

class Test_2 
{ 
public: 
    int i; 
    virtual void f(){}; 
}; 

int main() 
{ 
    Test_1 t1{}; 
    Test_2 t2{}; 

    cout<<t1.i<<endl; //0 
    cout<<t2.i<<endl; //-858993460 

    getchar(); 
} 
+3

Hangi derleyici ve hangi sürüme sahipsiniz? "{}", toplayıcılar için değer sıfırlaması olmalı ve kullanıcı tarafından sağlanan kurucusu olmadığı için "t2.i" sıfır başlatılmış olmalıdır. –

+0

Bu, [rextester] 'da (http://rextester.com/runcode) barındırılan MSVC'nin askıda kalmasına ve benzer bir çöp vermesine neden olur. Başka bir [MSVC çevrimiçi derleyici] ile aynı şey (http://webcompiler.cloudapp.net/). Bir böcek kokusu alıyorum. –

cevap

4

Derleyiciniz bunu yapıyorsa, bozuk.

[dcl.init.list]/p3 (bütün alıntılar N4140 vardır) aşağıdaki gibi bir nesne ya da tip T referansının

listesi-başlatma tanımlanır:

  • T bir toplam ise, toplu başlatma gerçekleştirilir (8.5.1).
  • Aksi takdirde, başlatıcı öğesinin bir öğesi yoksa ve T varsayılan kurucuya sahip bir sınıf türüyse, nesne değeri başlangıç ​​durumuna getirilir.
  • [...]

[dcl.init]/p8: tip T bir nesne değer başlatmak

için şu anlama gelir:

  • ise T olduğu öntanımlı yapıcı (12.1) ya da kullanıcı tarafından sağlanan veya silinen varsayılan bir kurucu ile bir (muhtemelen cv-kalifiye) sınıf türü (Madde 9) nesne varsayılan başlatılır;
  • T bir kullanıcı tarafından sağlanan veya silinmiş varsayılan kurucu olmayan bir (muhtemelen ev nitelikli) sınıf tipi ise, o zaman bir amacı, T bir sahipse sıfır başlatıldı ve varsayılan başlatma semantik kısıtları kontrol edilir ve bir önemsiz varsayılan yapıcı, nesne varsayılan başlatılır; T bir dizi tipi ise, her elemanın değeri başlatılmışsa
  • ; Aksi takdirde, nesne sıfır başlatılmış olur.

Test_2 bir toplama değildir, bu nedenle t2 olmalıydı değer başlatıldı. Sırasıyla, Test_2'un varsayılan yapıcısı kullanıcı tarafından sağlanmadığından, t2 ilk sıfır başlatılmış olması (t2.i'un 0'a başlatılmasına neden olmaktır) ve sonra varsayılan kurucu çalıştırılır.

+4

Önemsiz sınıfların değer başlatması gerçekten VC++ 'da kırılmış ve her zaman olmuştur. Ne yazık ki, başlangıç ​​anlambilim semantiğinin temel olarak gerekli olmasına rağmen, görünürde bir çözüm yok. [Burada] (https://connect.microsoft.com/VisualStudio/feedback/details/746973/yanlış-c-11-value-başlatma-için-örtülü olarak bildirilen-ama-önemsiz-varsayılan-yapıcı-başlatıcı) _many_ gönderilen hata raporlarından biri, tüm kapalı Gördüğüm 'ertelenmiş' olarak. [Bazı durumlarda, toplu başlatma bile doğru değil.] (Https://connect.microsoft.com/VisualStudio/Feedback/Details/956553) – ildjarn