gpt4 book ai didi

c++ - constexpr 静态成员变量的链接器错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:26 27 4
gpt4 key购买 nike

如果能解释一下为什么以下代码会产生编译错误,我将不胜感激:对 sinet::testtable 的 undefined reference 这是实际的代码:

#define TABLE_SIZE 2000
template<class Function, std::size_t... Indices>
constexpr static auto make_array_helper(Function f, std::index_sequence<Indices...>)
-> std::array<typename std::result_of<Function(std::size_t)>::type, sizeof...(Indices)>
{
return {{ f(Indices)... }};
}

template<int N, class Function>
constexpr static auto make_array(Function f)
-> std::array<typename std::result_of<Function(std::size_t)>::type, N>
{
return make_array_helper(f, std::make_index_sequence<N>{});
}
constexpr static float fun(double x) { return (float)sin(((double)x / (double)TABLE_SIZE) * M_PI * 2.0); }

class sinet{

public:
constexpr static auto testtable = make_array<TABLE_SIZE>(fun);
};

代码应该在编译时填充一个静态数组,只要 constexpr static array 不是成员,它就可以工作。

如果我将静态成员初始化为单个 float ,它就可以工作,因为没有链接器错误。但为什么?

有很多与此类似的问题,但我无法辨别特定于我的示例的答案。

如有任何帮助,我们将不胜感激。

编辑:

感谢 djrollins 的回答,我现在知道静态成员不能被评估为 constexpr,因为 sin 也不能。

不幸的是,所有这些都是为了在编译时初始化一个静态数组,但似乎这是不可能的。

最佳答案

constexpr static 成员只有在初始化器也是 constexpr 时才能在类体内初始化。

您的 fun 函数包含对 sin 的调用,与大多数标准数学函数一样,它不是 constexpr

关于c++ - constexpr 静态成员变量的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39937725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com