Rozważ ten kod:
#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);
}
To drukuje:
vector overload
int overload
Dlaczego nie powoduje to błędu kompilacji z powodu niejednoznacznej rozdzielczości przeciążenia? Jeśli drugi konstruktor zostanie usunięty, otrzymamy vector overload
dwa razy. Jak / według jakiej miary jest int
jednoznacznie lepsze dopasowanie {}
niżstd::vector<int>
?
Podpis konstruktora można z pewnością jeszcze bardziej przyciąć, ale właśnie zostałem oszukany przez równoważny fragment kodu i chcę się upewnić, że nic ważnego nie zostanie utracone w tym pytaniu.
{}
skutecznie działa w niektórych szczególnych przypadkach, ale ogólnie nie jest poprawne (na początek, std::vector<int> x = {};
działa, std::vector <int> x = 0;
nie działa). To nie jest tak proste jak „ {}
przypisuje zero”.
struct A { int x = 5; }; A a = {};
nie przypisuje zera w żadnym sensie, konstruuje A
z a.x = 5
. Inaczej jest w przypadku A a = { 0 };
inicjalizacji a.x
na zero. Zero nie jest nieodłączne {}
, jest nieodłączne od tego, jak każdy typ jest konstruowany domyślnie lub inicjowany na wartości. Zobacz tutaj , tutaj i tutaj .
{}
jako blok kodu, przypisuję 0 do zmiennych - przykład: const char x = {}; jest ustawiony na 0 (null char), to samo dla int itp.