2015-05-20 27 views
10

Bakalım, vücut yapıcım içinde bazı denetimler yapmak için nesnemin bir dış işlevini çağırmak istiyorum. Bir cismin ömrü, yapıcının gövdesi çalışmayı bitirdiğinde başlar, bu güvenli olmayan bir tasarım mıdır?C++: bir nesnenin ve harici işlevlerin ömür süresi

struct A; 

void check(A const&) { /* */ } 

struct A 
{ 
    A() { check(*this); } 
}; 

Yani henüz canlı olmayan bir nesneyle çağıran ve dış işlev yapıyorum. Tanımlanmamış davranış mı?

İlgili sorular: Bu işlev işlevini bir üye işlev olarak (statik değil) koyarsam, standardın yapıcı dışındaki henüz canlı olmayan nesneleri kullanma hakkında ne yazıyor?

Bir sınıfın bakış açısı ile kullanıcıları arasındaki bir ömür boyu kavramında herhangi bir farklılık var mı (sınıf-dışı sınıf dışı yaşam süreleri)?

+2

[C++ SSS] (https://isocpp.org/wiki/faq/ctors#using-this-in-ctors) bunun hakkında bilgi sahibidir. –

+0

Bu işlev, üye sanal değil ve başlangıç ​​listesinde yok – KABoissonneault

+1

A const & bir referanstır ve işlevlerin sonunda ne çek başlangıcında ne de ne yok olduğu sürece iyi olmalıdır. Yapıcının içinde ayrıca nesne tamamen inşa edilmiştir. Bu kodda herhangi bir sorun görmüyorum – Brahim

cevap

8

check() çağrıldığında [base.life] 'den, çünkü A ömrü başlamıştır olmaz: tip T bir nesne süresi başlar

zaman:

  • depolama ile T tipi için uygun hizalama ve boyut elde edilir ve nesnenin kesintisiz başlatılması durumunda, , başlatma işlemi tamamlanır.

A olmayan anlamsız başlatma sahiptir. Onun başlatma gelen [class.base.init]/13, ne zaman tamamlanır:

olmayan bir delegating Yapıcıda

, aşağıdaki sırayla başlatma ilerler:

  • ...
  • - Son olarak, yapıcı gövdesinin bileşik-beyanı yürütülür. , 10,3

    üye işlevlerini (sanal üye işlevlerini de dahil olmak üzere:

Ancak A rağmen süresi standart ilave [class.base.init]/16, içerir, henüz başlamış olan değil), yapım aşamasında bir nesne için çağrılabilir ... Ancak, bu işlemler ctor-başlatıcı (veya doğrudan veya dolaylı olarak ctor-başlatıcı'dan gelen bir işlevde) başlatılmaktadır Baz sınıfları için alizers tamamlandı, işlemin sonucu tanımsızdır.

void check(const A&) { .. } 
struct A { 
    A() { check(*this); } 
}; 

Ve:

ömür boyu sorunları ile ilgili olarak

, arasında hiçbir fark yoktur

struct A { 
    void check() const { .. } 
    A() { check(); } 
}; 

ikincisi açıkça izin verilir (bir ctor-başlatıcısı içinde olmasın da) Öyleyse, eskinin ömür boyu gerekçesiyle hariç tutulması için bir sebep göremiyorum.

+0

... A, 'check() 'ile çağrılan sanal üyelere sahip bir taban sınıfı ise, sonuç sizi şaşırtabilir. –

+0

@RichardHodges Tanımlanmamış bir davranış olsa da. – Barry

+0

@Barry Başlatma işleminin burada biteceğinden emin misiniz? http://stackoverflow.com/a/20409911/1794803 –