c++ - 我可以在类外初始化一个 `constexpr static` 成员吗?

标签 c++

我正在使用可变宽度的通信格式。处理它的结构看起来像这样:

struct Header
{
  int msgType = -1, len;

  Header() { len = sizeof(*this); }
};

struct A : public Header
{
  int x; char y;

  A() { msgType = 1; len = sizeof(*this); }
};

// Further structs B, C, ... declared along the same lines
我想要一个 constexpr static成员(member)Header::MAX_SIZE这给出了任何这些派生类的最大大小,例如所以我可以分配一个缓冲区,保证可以容纳任何这样的数据包。所以我想做类似的事情
struct Header
{
  int msgType = -1, len;

  constexpr static std::size_t MAX_SIZE;

  Header() { len = sizeof(*this); }
};

// ... declaration of subclasses ...

inline Header::MAX_SIZE = std::max({ sizeof(A), sizeof(B), sizeof(C) });
我需要定义在类之外,因为它取决于 sizeof(A)等,这又取决于 Header 的定义.
看起来这种事情应该是无可争议的:我在同一个源文件中给出了成员的定义,并且可以在编译时计算。但是我还没有找到任何方法来告诉编译器实际执行此操作。

最佳答案

constexpr继续初始化 变量的声明,因此只需将其放在类之外:

struct Header
{
  int msgType = -1, len;

  static const std::size_t MAX_SIZE;

  Header() { len = sizeof(*this); }
};

// ... declaration of subclasses ...

inline constexpr std::size_t Header::MAX_SIZE = std::max({ sizeof(A), sizeof(B), sizeof(C) });
注意隐式 const必须在声明中详细说明。定义应该在 中同 标题以避免任何翻译单元看到声明而不是 inline ,这是不允许的。

关于c++ - 我可以在类外初始化一个 `constexpr static` 成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67300293/

相关文章:

c++ - 避免复制重复使用的特征 block

c++ - 被覆盖的纯虚函数是虚拟的吗?

c++ - std::unique_ptr 中的抽象类作为函数的返回不起作用

c++ - 如何获取目标应用程序的 tcp/udp 端口​​列表

c++ - 如何使用 cgal 循环器?

c++ - 如何插入 UV 坐标?

c++ - 获取堆栈溢出,找不到位置

c++ - 调用mono_jit_init时退出1

c++ - 如何统计模板类的CRTP子类个数?

c++ - 预编译头文件中的错误 C2512?