struct A
{
A(const A& src);
A(const char* src);
};
struct B
{
operator A();
operator char*();
};
void test()
{
B v;
A s(v);
}
EDG/Comeau und MSVC ermöglicht den Code während GCC 4.4.4, CLANG und BCC es als mehrdeutig ablehnen.Sollte dies mehrdeutig sein oder nicht? (implizite Umwandlungen)
Ein C++ Ausschussmitglied antwortete mit dieser (zunächst):
Es ist nicht zweideutig; der Konstruktor A (const A &) ist besser als der Konstruktor A (const char *). Die const A & Parameter, der direkt auf das Ergebnis der Umwandlungsfunktion binden, so dass die Umwandlungsfolge zu betrachte Umwandlung eine vom Benutzer definiert werden, gefolgt von einer Identitäts Umwandlungs (13.3.3.1.4p1). Der const char * Parameter ist eine benutzerdefinierte Konvertierung gefolgt von einer Qualifikation Umwandlung, so ist es schlimmer.
Dann folgte er mit diesem.
Eigentlich lag ich falsch. Zwar ist es wahr, dass die zweite Umwandlung Sequenz in einer benutzerdefinierten Konvertierung Sequenz ein Tie-Break ist, mehr sucht eng an 13.3.3.2p3, die next-to-letzte Kugel zeigt, dass dieses Tie-Break gilt nur, wenn Die beiden Sequenzen enthalten dieselbe benutzerdefinierte Konvertierungssequenz und , was in diesem Beispiel nicht der Fall ist. Da eine Konstruktor der Umwandlung Sequenz B :: operator A() verwendet, und die andere Verwendungen b :: operator char *(), es gibt keine tiebreaker zwischen den beiden benutzerdefinierten Konvertierungssequenzen und sie sind zweideutig.
Meine Frage ist dies.
13.3.3.2 p3 stellt fest, dass,
zwei implizite Umwandlung Sequenzen von die gleiche Form gelten ununterscheidbar Konvertierungssequenzen sofern nicht eine der folgenden Regeln sind.
Von meinem Verständnis sind die Schlüsselwörter "eine der folgenden Regeln". Es bedeutet nicht, dass die Kugel, die "dieselbe Umwandlungssequenz" angibt, überschreibt alle oben genannten. Ich hätte gedacht "der Rang von S1 ist besser als der Rang von S2" wäre stattdessen anwendbar?
Feiner Beweis, dass C++ es ein bisschen zu kompliziert ... – Hexagon
Da Sie einen C++ Community-Mitglied Kontakt haben, sollten Sie ihn nicht einfach bitten, ein Problem zu stellen? (oder überprüfen Sie, ob es unter http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html abgelegt ist) –
Ich habe nicht gesagt, dass es ein Problem gibt, ich versuche tatsächlich, das zu verstehen Standards. –