Pytanie powstało w kontekście this answer.Dlaczego inicjowanie listy bezpośredniej powoduje niejednoznaczność przy rzutowaniu typu referencyjnego, jeśli deklarowane są operatory rzutowania na typ i odniesienie do typu?
Rozważmy przykład:
struct foo {
int value;
operator int&(){ return value; }
operator int(){ return value; }
};
int main() {
int &a(foo{}); // #1
//int &b{foo{}}; // #2 -- ambiguity
int &c = foo{}; // #3
//int &d = {foo{}}; // #4-- ambiguity
int &d { a }; // #5
int &e = { a }; // #6
(void)a;
(void)c;
(void)d;
(void)e;
}
Nie rozumiem dlaczego # 2 i # 4 przyczyna niejednoznaczności podczas # 1 i # 3 nie. Tak więc pytanie brzmi: dlaczego inicjowanie listy bezpośredniej powoduje niejednoznaczność dla niejawnego rzutowania na odniesienie, jeśli deklarowane są operatory rzutowania na typ i odniesienie do typu?
'int & a (foo {})' to bezpośrednia inicjalizacja. 'int & b {foo {}}' to bezpośrednia inicjalizacja * listy *. To nie to samo. –