我想写一个类,它有一个
constexpr
类型的成员 std::array<char, 26>
.
我可以使用像这样的 constexpr 免费(非成员)函数来初始化这个数组成员:
namespace {
constexpr std::array<char, 26> buildArrayNonMemberFunction()
{
return {};
}
}
struct S {
constexpr static std::array<char, 26> letters{ buildArrayNonMemberFunction() };
};
但是,我不想使用非成员函数初始化数组,而是调用成员函数。
我得到了
x64 msvc v.19.33
或 v19.latest
这样做的工作:
struct S {
template<size_t N>
constexpr static std::array<char, 26> BuildArrayMemberFunction()
{
return {};
}
constexpr static std::array<char, 26> letters{ BuildArrayMemberFunction<26>() };
};
或
struct S {
template<size_t N = 26>
constexpr static std::array<char, 26> BuildArrayMemberFunction()
{
return {};
}
constexpr static std::array<char, 26> letters{ BuildArrayMemberFunction() };
};
没有
template<size_t N>
,即template<size_t N = 26>
,它编译失败,说:
error C2131:表达式未计算为常量
消息:失败是由调用未定义的函数或未声明的“constexpr”引起的 消息:查看“S::BuildLettersArrayMemberFunction”的用法
我的问题:
msvc
上有效,但在 gcc
或 clang
上不起作用?template<size_t N>
或template<size_t N = 26>
?换句话说:为什么没有它的功能是undefined
或not declared 'constexpr'
否则?