Не считаю что стандарт прозрачен, раз компиляторы уж слишком вольно его толкуют.
Согласно стандарту, нельзя использовать в constexpr любые манипуляции с преобразованием типа указателя (то есть использовать reinterpret_cast как таковой, равно как и преобразования от указателя на бестиповый на любой из типов).
Код позволяет конкретно этот просто указывает место в котором происходит ошибка.
любые манипуляции с адресной арифметикой запрещены в самом стандарте
но формат пути только такой.
void somefunc() {do_something_with blabla::a2}
template< typename TEnumType, typename TValueType >
class EnumValues final
{
static_assert( std::is_enum<TEnumType>::value, "The `TEnumType` type have to be enumeration." );
public:
using UnderlyingType = std::underlying_type_t<TEnumType>;
using Values = std::array<TValueType, static_cast<UnderlyingType>( TEnumType::MAX )>;
EnumValues() = default;
EnumValues( const EnumValues& ) = default;
EnumValues( EnumValues&& ) = default;
EnumValues( std::initializer_list<TValueType> values );
EnumValues( const Values& values );
EnumValues( Values&& values );
inline EnumValues& operator = ( cosnt EnumValues& ) = default;
inline EnumValues& operator = ( EnumValues&& ) = default;
inline EnumValues& operator = ( std::initializer_list<TValueType> values );
inline EnumValues& operator = ( const Values& values );
inline EnumValues& operator = ( Values&& values );
inline TValueType& operator [] ( const TEnumType value ) { return m_values[ static_cast<UnderlyingType>( value ) ]; };
inline const TValueType& operator [] ( const TEnumType value ) const { return m_values[ static_cast<UnderlyingType>( value ) ]; };
private:
Values m_values;
};
enum class ValueIndices
{
qqq = 0,
www,
NAX_VALUES
};
using Values = std::array<int32_t, size_t( ValueIndices::MAX_VALUES )>;