g ++ folgenden Code-Schnipsel kompilieren fehlschlägt:g ++, bitfields und ADL
namespace X {
enum En {A, B};
bool test(En e);
}
bool check() {
union {
struct {
X::En y:16;
X::En z:16;
} x;
int z;
} zz;
return test(zz.x.y);
}
Der Fehler gibt es folgt
In function 'bool check()': 15 : error: 'test' was not declared in this scope return test(zz.x.y);^15 : note: suggested alternative: 3 : note: 'X::test' bool test(En e); ^~~~ Compilation failed
Wenn ich y
ein reguläres Mitglied zu machen, anstatt ein Bitfeld, Code kompiliert erfolgreich. Das Aufrufen eines Namens-Abstandes test
funktioniert auch. Clang kompiliert das Programm so, wie es ist, ohne sich zu beschweren.
Bitfield-Geschäft zur Seite legen (ich liebe es überhaupt nicht, aber Codebase hat es) und sich nicht darauf konzentrierend, ob ich eine Garantie habe, eine Enum in das 16-Bit-Mitglied zu passen oder nicht, gibt es etwas Besonderes in Bezug auf Bitfelder was verhindert, dass ADL eintritt, wie ich es erwarte?
Wenn Sie explizit den Typ: 'Enum En: kurz 'setzen es kompiliert – hauron
@ Hauron, interessante Beobachtung, danke. – SergeyA
'enum En: int' kompiliert auch nicht. Minimal Beispiel erfordert nicht die "Union", um den Fehler auszulösen. Dem Fehler geht die Warnung 'warning 'voraus: :: y' ist zu klein, um alle Werte von 'enum X :: En'' zu enthalten. Wenn das gepackte Bitfeld groß genug ist, um den angegebenen Typ (der standardmäßig auf "unsigned int" steht) ohne Abschneiden zu halten, ist es erfolgreich. Es scheint so, als ob gcc beschließt, Parameter, die abgeschnitten wurden, als gültige Hinweise für ADL zu ignorieren. –
Ext3h