2014-11-25 26 views

cevap

36

C++ 11 sınıf içi üye başlatıcılarına sahip olduğunda, yapı/sınıf bir toplam — yapmaz, bu durum C++ 14'te değiştirilmiştir. Bu ilk karşılaştığımda şaşırtıcı bulduğum bir şey, bu kısıtlamanın mantığı, sınıftaki başlatıcıların, kullanıcı tanımlı bir kurucuya oldukça benzemesidir, ancak karşı argüman, hiç kimse gerçekten sınıf içi başlatıcıların eklenmesini beklememesi gerektiğidir. sınıfları/yapıları toplu değil, emin olmadı. C++14 aynı paragraf okur

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

ve: (ileri gidiş vurgu benim) draft C++11 standard bölüm 8.5.1Agregalar itibaren

Bu değişiklik N3605: Member initializers and aggregates kaplıdır

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

hangi aşağıdaki özet bulunmaktadır:

Bjarne Stroustrup and Richard Smith raised an issue about aggregate initialization and member-initializers not working together. This paper proposes to fix the issue by adopting Smith's proposed wording that removes a restriction that aggregates can't have member-initializers.

Bu yorum, temelde onları agrega olmak için izin konusunda isteksizlik özetliyor:

Aggregates cannot have user-defined constructors and member-initializers are essentially some kind of user-defined constructor (element) (see also Core Defect 886). I'm not against this extension, but it also has implications on what our model of aggregates actually is. After acceptance of this extension I would like to know how to teach what an aggregate is.

revize edilmiş versiyonu N3653May 2013 kabul edilmiştir.

G++ 5.0 now supports C++14 aggregates with non-static data member initializers ya std=c++1y veya -std=c++14 kullanarak işaret EMSR Güncelleme

:

struct A { int i, j = i; }; 
A a = { 42 }; // a.j is also 42 

o live çalışma Bkz.

+0

Yani tam bir sorun değil gibi görünüyor gcc – Bikineev

+0

@Bikineev hmmm, hangi gcc' sürümünü kullanıyorsunuz? '-std = C++ 11' kullanarak' gcc' '4.7' -' 4.9' arasında yeniden üretemiyorum. Sorunuzu açıklayabilir misiniz, "clang" ın kabul ettiğini söylediniz, sanırım "gcc" mi demek istediniz? –

+0

Gcc 4.9.1 kullanıyorum. Ben gcc'in bu değişikliği teklifinden desteklemediğini kastettim. Ben: "hata: 'A :: A ()'" – Bikineev

İlgili konular