folgendes Beispiel:Benutzerdefinierte implizite Umwandlung einer Enum-Klasse, wenn ein überladenen Operator Aufruf fehlschlägt
struct ConvertibleStruct {};
enum class ConvertibleEC {};
struct Target {
// Implicit conversion constructors
Target(ConvertibleStruct) {}
Target(ConvertibleEC) {}
};
Target operator~(const Target& t) {
return t;
}
Target anotherFunction(const Target& t) {
return t;
}
int main() {
ConvertibleStruct t;
ConvertibleEC ec;
~t; // 1. Works finding the operator overloaded above
~ec; // 2. Fails to compile on clang 3.4 and gcc 4.8.2
operator~(ec); // 3. Works finding the operator overloaded above
anotherFunction(ec); // 4. Works
}
Compiler-Versionen:
Die obigen Ergebnisse sind für clang 3.4
und gcc 4.8.2
. Test 2 kompiliert tatsächlich gut unter gcc 4.7.3
mit -std=c++11
. Möglicherweise ein Fehler in der frühen GCC C++ 11 Implementierung?
Assertions:
- Da 1. compiliert, benutzerdefinierte implizite Konvertierungen überprüft werden, wenn die
~
Operator aufrufen. - Angesichts 4. Compiles werden benutzerdefinierte implizite Konvertierungen für
enum class
Objekte überprüft.
Fragen:
- Sind die oben genannten Behauptungen richtig?
- Wenn sie sind, warum kompiliert 2. nicht?
- Gegeben, dass 2. nicht kompiliert, warum kompiliert 3.?
Dies scheint eine Vor-Standardisierung Entscheidung zu sein: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1137.asc Ich bin mir nicht sicher über die Begründung. – dyp
Interessant. Dies erklärt möglicherweise auch, warum es auf 'gcc 4.7.3' kompiliert. IIRC, die 'enum class' Implementierung in GCC zu dieser Zeit basierte auf' struct's – Clivest