Aus [dcl.init]:
Andernfalls (das heißt, für die verbleibenden Kopie-initialization Fälle), benutzerdefinierte Konvertierungssequenzen, die vom Quelltyp zu dem Zieltyp umwandeln kann oder (wenn eine Umwandlungsfunktion verwendet wird) zu einer davon abgeleiteten Klasse werden wie in 13.3.1.4 beschrieben gezählt, und die beste ist , die durch Überladungsauflösung (13.3) ausgewählt wird.
Wir können eine benutzerdefinierte Umwandlung aufzurufen, die von der Quelle Typ ist direkt in den Zieltyp. Das heißt, wenn wir Bar(float)
hätten, würden wir diesen Konstruktor berücksichtigen. In diesem Fall ist unser Kandidat jedoch einfach Bar(Foo)
, was keinen float
erfordert.
Sie dürfen keine oder eine benutzerdefinierte Konvertierung durchführen. Im Fall der direkten Initialisierung rufen wir einfach Bar(Foo)
auf, wodurch eine benutzerdefinierte Konvertierung (float --> Foo
) aufgerufen wird. Im Fall der Kopierinitialisierung suchen wir nach einer Konvertierungssequenz von float
(dem Quelltyp) bis hin zu Bar
(dem Zieltyp), was zwei benutzerdefinierte Konvertierungen (float --> Foo
, Foo --> Bar
) bedeutet Error.
Versuchen Sie, 'Bar (Foo foo)' in 'Bar (const Foo & foo) zu ändern' –
@RemyLebeau Warum hast du gedacht, dass es funktioniert (tut es nicht)? –