Bu kodu düşünün:
#include <vector>
#include <iostream>
enum class A
{
X, Y
};
struct Test
{
Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X)
{ std::cout << "vector overload" << std::endl; }
Test(const std::vector<double>&, int, A = A::X)
{ std::cout << "int overload" << std::endl; }
};
int main()
{
std::vector<double> v;
Test t1(v);
Test t2(v, {}, A::X);
}
Bu yazdırır:
vector overload
int overload
Belirsiz aşırı yük çözünürlüğü nedeniyle neden bir derleme hatası oluşturmuyor? İkinci kurucu kaldırılırsa, vector overload
iki kez elde ederiz . Metrik nedir tarafından nasıl / int
Bir açık bir şekilde iyiye maç {}
daha std::vector<int>
?
Yapıcı imzası kesinlikle daha da kesilebilir, ama sadece eşdeğer bir kod parçası tarafından kandırıldım ve bu soru için önemli bir şeyin kaybolmadığından emin olmak istiyorum.
{}
Bazı özel durumlarda etkili olan budur , ancak genellikle doğru değildir (yeni başlayanlar, std::vector<int> x = {};
işler, std::vector <int> x = 0;
yapmaz). " {}
Sıfır atar " kadar basit değil .
struct A { int x = 5; }; A a = {};
hiçbir anlamda sıfır atamaz , bir A
ile oluşturur a.x = 5
. Bu farklıdır A a = { 0 };
, a.x
sıfır olarak başlar. Sıfırın doğasında olmayan {}
, her türün varsayılan olarak nasıl yapılandırıldığı veya değerle başlatıldığının doğasında vardır. Bkz burada , burada ve burada .
{}
bir kod bloğu olarak değişkenlere 0 atar - örnek: const char x = {}; int vb. için 0 (boş karakter) olarak ayarlanır.