Учитывая, что std::array<T,N>::size
- constexpr, в приведенном ниже фрагменте
- Почему имеет значение, что
Foo1::u
не является членомstatic
? Тип известен во время компиляции, как и егоsize()
. - Что не так с
Foo2::bigger()
?
Листинг:
// x86-64 gcc 10.1
// -O3 --std=c++20 -pedantic -Wall -Werror
#include <array>
#include <cstdint>
union MyUnion {
std::array<uint8_t,32> bytes;
std::array<uint32_t,8> words;
};
struct Foo1 {
MyUnion u;
static constexpr size_t length {u.bytes.size()};
//invalid use of non-static data member 'Foo1::u'
};
struct Foo2 {
MyUnion u;
size_t x;
consteval int8_t length() const { return u.bytes.size(); };
bool bigger() const { return x > length(); }
//'this' is not a constant expression
};
Я хотел бы сохранить длину std :: array в объявлении MyUnion
и не прибегать к
constexpr size_t LEN {32};
union MyUnion {
std::array<uint8_t,LEN> bytes;
std::array<uint32_t,LEN/4> words;
};