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 overloadiki kez elde ederiz . Metrik nedir tarafından nasıl / intBir 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 Aile oluşturur a.x = 5. Bu farklıdır A a = { 0 };, a.xsı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.