如何使用成员函数初始化 constexpr std::array 类成员? [重复]

问题描述 投票:0回答:0

我想写一个类,它有一个

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'
    否则?
c++ initialization constexpr stdarray class-members
© www.soinside.com 2019 - 2024. All rights reserved.