Рассмотрите следующий длинный комментарий вместо ответа (извините).
Я не знаю, кто прав (MSVS, которые принимают все, g ++, которые принимают f
, но отказываются g
или clang ++, которые отказываются как f
, так и g
), но, если я правильно понимаю, это упрощение более сложной проблемы, которую вы не можете решить, просто используя int
и int *
вместо auto
.
Поэтому я предлагаю вставить пару типов внутрь TestEle2
using typeF = decltype(5);
using typeG = decltype(&DStruct<char, t>::a);
и используйте их вместо auto
и decltype()
для типов f
и g
.
Ниже приводится полная компиляция (как g ++, так и c ++; я не знаю MSVS (извините)) пример
template <class T, T t>
struct TestEle2
{ };
template <class T, T t>
struct DStruct
{ int a; };
template <char t>
struct TestEle2<char, t>
{
using typeF = decltype(5);
using typeG = decltype(&DStruct<char, t>::a);
static constexpr typeF f = 5;
static constexpr typeG g = &DStruct<char, t>::a;
};
// This compiles
template <char c>
constexpr typename TestEle2<char, c>::typeF TestEle2<char, c>::f;
// This also compile
template <char c>
constexpr typename TestEle2<char, c>::typeG TestEle2<char, c>::g;
int main()
{
}