Учитывая struct B
, который наследует анонимный элемент данных union
от struct A
:
#include <cstddef>
struct A
{
union
{
struct { int a, b, c; };
int vals[3];
};
};
struct B: A
{
constexpr B(int x)
:
A{{{ x, x, x }}}
{}
constexpr int& operator[](size_t i)
{
return this->vals[i];
}
constexpr const int& operator[](size_t i) const
{
return this->vals[i];
}
};
Объявляю переменную constexpr
типа B
, а затем вызываю ее operator[]
, чтобы присвоить возвращаемое значение a constexpr int
:
int main()
{
constexpr B b(7);
constexpr int i = b[2];
return 0;
}
Однако Clang 3.8 дает мне сообщение об ошибке
constexpr variable 'i' must be initialized by a constant expression
Проблема связана с анонимным union
, поскольку, когда я просто использую int vals[3]
, все работает нормально.
Есть ли ограничение С++ 14 constexpr
, которое мне не хватает?