Betrachten Sie das folgende Stück Code:Chaining Benutzer Umwandlungen in C++
#include <iostream>
struct C
{
C()
{
std::cout << "C()\n";
}
explicit C(const C&)
{
std::cout << "C(const C&)\n";
}
operator int()
{
std::cout << "int()\n";
return 1;
}
C(int)
{
std::cout << "C(int)\n";
}
};
int main()
{
C c1;
std::cout << '\n';
C c2 = c1;
std::cout << '\n';
C c3(c1);
}
Beide g++
und clang
geben die folgende Ausgabe:
C()
int()
C(int)
C(const C&)
Ist es nicht die Regel brechen sagen, dass eine implizite Konvertierung Sequenz kann aus höchstens einer Benutzerkonvertierung bestehen?
Welche Ausgabe haben Sie erwartet? – sehe
Ich könnte mich irren, aber 'C (int)' nimmt ein 'int'. 'C -> int 'ist eine benutzerdefinierte Konvertierung. Ich verstehe nicht, warum "int-> C" in dieser Sequenz enthalten wäre. Es ist eher wie 'std :: string s (someObjectWithACstrConversion);'. Die Funktion, die Sie aufrufen, ist zufällig etwas, das als Konvertierung an anderer Stelle verwendet werden kann. – chris
@sehe Ich würde einen Compilerfehler erwarten. – piotrekg2