g ++ nie trafia do kompilacji kodu następujący fragment:g ++, bitfields i 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);
}
Błąd daje się następujące
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
Jeśli zrobię y
stałym członkiem, zamiast bitfield, kod kompiluje się pomyślnie. Wywołanie także nazwy-odstępu test
działa również. Clang kompiluje program tak, jak jest, bez żadnych skarg.
Odkładanie biznesu na bok (nie podoba mi się w ogóle, ale ma go codebase) i nie koncentruję się na tym, czy mam gwarancję dopasowania enum do 16-bitowego członka, czy jest coś specjalnego w bitfields co uniemożliwia kopanie ADL, tak jak tego oczekuję?
Jeśli jawnie ustawisz typ: 'enum En: short' kompiluje – hauron
@hauron, ciekawą obserwację, dzięki. – SergeyA
'enum En: int' również się nie kompiluje. Minimalny przykład nie wymaga "union" do wywołania błędu. Błąd jest poprzedzony ostrzeżeniem 'warning: ' :: y' jest zbyt mała, aby pomieścić wszystkie wartości 'enum X :: En''. Jeśli spakowane pole bitowe jest wystarczająco duże, aby pomieścić określony typ (domyślnie "unsigned int") bez obcięcia, to się uda. Wygląda to tak, jakby gcc zdecydował się zignorować parametry, które zostały skrócone, jako prawidłowe wskazówki do ADL. –
Ext3h