gpt4 book ai didi

c++ - 由于模板基类,从不完整类型初始化静态 constexpr

转载 作者:太空狗 更新时间:2023-10-29 19:58:29 26 4
gpt4 key购买 nike

我有一个模板基类,期望子类将自身作为模板参数传递。

看起来有点像这样:

template<typename T>
struct Base {
constexpr Base(int x) : m_x(x) {}
private:
int m_x;
};

struct Derived : public Base<Derived>
{
static const Derived LIFE;
constexpr Derived(int x) : Base(x) {}
};

const Derived Derived::LIFE = Derived(42);

按预期编译和工作。但现在我想让 Derived::LIFE 成为一个 constexpr。这可能吗?

我不能只将它的 const 限定符更改为 constexpr,因为 constexpr 需要在其声明中初始化:

test.cpp:10:28: error: constexpr static data member ‘LIFE’ must have an initializer
static constexpr Derived LIFE;

我无法在那里初始化它,因为 Derived 是一个不完整的类型:

test.cpp:10:45: error: invalid use of incomplete type ‘struct Derived’
static constexpr Derived LIFE = Derived(42);

我意识到如果 Derived 是一个完整类型,这个问题就会消失,但由于与这个问题无关的原因,在这个特殊情况下我非常依赖自引用模板化基类。

如果我理解 this answer 中的最后一段正确地说,听起来至少有一些关于在未来某个时候改变处理不完整类型的方式的讨论,但现在这对我没有帮助。

有人知道在我上面的代码中延迟 LIFE 初始化的某种技巧吗?

最佳答案

您可以简单地将 constexpr 添加到 LIFE 的定义中:

constexpr Derived Derived::LIFE = Derived(42);

直到最近 GCC 有一个错误,它拒绝了这个;您需要使用 Clang 或 GCC 4.9。

关于c++ - 由于模板基类,从不完整类型初始化静态 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008861/

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