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

标签 c++ templates c++11 constexpr

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

看起来有点像这样:

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/

相关文章:

c++模板函数参数推导和函数解析

c++ - 减少参数数量

c++ - 在现代 C++ 中为层次图定义访问者内联

c++ - 请帮助使用 MFC CMap(或 std::map)

c++ - 将具有外部实现的模板编译为静态库

c++ - 表示平面图/GIS 拓扑 : ArcObjects vs. CGAL 安排

c++ - 是否可以在模板类中有条件地声明方法和变量?

c++ - 具有由整数确定的固定数量参数的函数

c++ - 如何将 RTP 数据包与其他数据包分开

c++ - 它是否与共享指针一起正常工作(C++)