Der folgende C++ Programm ohne Warnungen in allen Compilern kompiliert Ich habe versucht (gcc 4.6.3, llvm 3.0, icc 13.1.1, SolarisStudio 12.1/12.3):Verschiedene Guss Betreiber von verschiedenen Compilern verwendet
struct CClass
{
template<class T>
operator T() const { return 1; }
operator int() const { return 2; }
};
int main(void)
{
CClass x;
return static_cast<char>(x);
}
Alle SolarisStudio-Compiler geben jedoch 2 zurück, SolarisStudio (beide Versionen) gibt 1 zurück, was ich als das logischste Ergebnis erachte.
Mit return x.operator char();
Ergebnisse in allen Compilern 1.
Offensichtlich zurückkehren, dies seit herauszufinden, habe ich die letztere Notation. Ich würde jedoch gerne wissen, welcher der Compiler korrekt ist und warum. (Man würde denken, dass die Mehrheit Regeln, aber diese nicht erklärt noch nicht die warum.)
Diese Frage zu den SO Fragen zu sein scheint here, here und here, aber diese „nur“ geben Lösungen Probleme, keine Erklärungen (die ich sowieso auf mein spezielles Problem anwenden konnte).
Beachten Sie, dass das Hinzufügen eines zusätzlichen überladenen Casting-Operators, z. B. operator float() const { return 3; }
, dazu führt, dass sich alle Compiler außer SolarisStudio über Unklarheiten beschweren.
Nur getestet in meinem Compiler, G ++ 4.8.0, und es gibt 1. – rodrigo
G ++ 4.7.2 gibt auch 1. Und mit 'operator float()' gibt es keine Beschwerde über Zweideutigkeiten. – hvd
g ++ gibt eine ab 4.7 zurück http://gcc.godbolt.org/ – Riga