оценка constexpr внутри скобок шаблона
Почему следующая инъекция constexpr
встроен в шаблон не работает
#include <iostream>
#include <type_traits>
template<typename E>
static constexpr auto enumToInt(E e) -> typename std::underlying_type<E>::type
{
return static_cast<typename std::underlying_type<E>::type>(e);
}
template<typename E>
static consteval auto enumToIntC(E e)
{
constexpr auto value = enumToInt(e);
return std::integral_constant<typename std::underlying_type<E>::type, value>{};
}
int main()
{
enum A{ A,B};
constexpr auto e = A::A;
constexpr auto i = enumToInt(e); // works
constexpr auto c = enumToIntC(e); // does not compile...
}
Почему существует ограничение на введение явно constexpr
value
в шаблон non-type
параметр не разрешен? Не понимаю, почему есть такое ограничение? Это не компиляция, потому чтоconsteval
еще не реализовано в clang-10
и распадается на constexpr
...?
Потому что это работает:
template<int N> struct A {};
constexpr int value = 3;
A<value> b;