оценка 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;

0 ответов

Другие вопросы по тегам