gpt4 book ai didi

c++ - 在类模板中正确初始化静态 constexpr 数组?

转载 作者:IT老高 更新时间:2023-10-28 22:19:18 51 4
gpt4 key购买 nike

由于标准的措辞,C++ 中的静态类成员给我带来了一些困惑:

9.4.2 Static data members [class.static.data]

The declaration of a static data member in its class definition is not a definition...

但是,constexpr 需要在其声明(例如,在类定义中)进行初始化(AFAIK,无法从标准中找到引用)。

由于对 constexpr 的限制,我实际上忘记了在类之外定义静态成员的必要性,直到我尝试访问静态 constexpr 数组。 This related question提供了定义数组成员的正确方法,但我对这个定义在类模板中的含义很感兴趣。

这就是我最终的结果:

template<typename T>
class MyClass
{
private:
static constexpr std::size_t _lut[256] = { /* ... */ };
T _data;

public:
static constexpr std::size_t GetValue(std::size_t n) noexcept
{
return _lut[n & 255];
}

// ...
};

template<typename T>
constexpr std::size_t MyClass<T>::_lut[256];

这是正确的语法吗? 特别是在定义中使用模板感觉很尴尬,但 GCC 似乎正确地链接了所有内容。

作为后续问题,是否应该类似地定义非数组静态 constexpr 成员(在类外使用模板定义)?

最佳答案

如果它可以帮助任何人,以下对我使用 constexpr 的 GCC 4.7 有用:

template<class T> class X {
constexpr static int s = 0;
};
template<class T> constexpr int X<T>::s; // link error if this line is omitted

我没有声称这是否“正确”。我会把它留给那些更有资格的人。

关于c++ - 在类模板中正确初始化静态 constexpr 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395967/

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