2017-09-19 25 views
8

Bir başlatıcı listesini parantez içinde sarmalamanın etkisi nedir? Liste başlatma için başka bir form mu yoksa sadece belirli senaryolarda mı çalışıyor?Bir başlatıcı listesini parantez içinde sarmalamanın etkisi nedir?

Örneğin, a düşünün:

struct A { 
    A(float a, float b) {} 
}; 

int main() 
{ 
    A b(1.0f, 0.0f); // Direct initalization, finds ctor for (float, float) 
    A c{1.0f, 0.0f}; // List initalization, finds a matching ctor 

    A a({1.0f, 0.0f}); // Is this list initalization... which is expanded? 
} 

cevap

10

A a(something)something den a inşa söylüyor.ile something'u değiştirirsek, paremetrenin {1.0f, 0.0f} ile başlatılabileceği bir kurucu bulmamız gerekir. Sahip olduğumuz tek kurucular, sırasıyla const A& ve A&& numaralarını alan varsayılan kopya ve taşıma kurucularıdır.

A a({1.0f, 0.0f}); 

aslında geçici A oluşturmak ve daha sonra geçici a başlatmak için olduğunu kullanacak mı yapıyor

Yani,. Bu durumda, hareket ettiriciyi, nesne hareket edebilen ve hareket ettiricilerin rıhtılarla uğraşırken kurucuları kopyalamak üzere tercih ettikleri için kullanacaktır.

+0

Bu lanet olası kurucular ... alışmak için zaman alır. Teşekkürler! – Raginator

+0

@Raginator Sorun değil. Ben sadece, bu durumda daha iyi bir eşleşme olduğu gibi kopya yapıcı yerine hareket yapıcıyı kullanacağı gibi hareket semantiği içerecek şekilde cevabı güncelledim. – NathanOliver

+3

Teknik olarak doğru olmasına rağmen, herhangi bir hareket veya kopya kurucusu seçilecekleri için çağrılmayacaktır (C++ 17'de zorunlu kopya seçimi bile). C++ 14'te bu yapıcılar hala erişilebilir olsa da, C++ 17'de bile silinebilirler. – Jodocus

İlgili konular