La question est passée dans le contexte de this answer.Pourquoi l'initialisation de la liste directe provoque-t-elle une ambiguïté pour la référence de type cast si les opérateurs de cast du type et la référence au type sont déclarés?
Prenons un exemple:
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;
}
Je ne comprends pas pourquoi est-# 2 et # 4 cause de l'ambiguïté alors que # 1 et # 3 ne fonctionne pas. La question est donc la suivante: pourquoi l'initialisation directe de la liste entraîne-t-elle une ambiguïté pour la distribution implicite afin de faire référence si les opérateurs de conversion au type et la référence au type sont déclarés?
'int & b {foo {}}' est l'initialisation directe * list *. Ce ne sont pas la même chose. –