【问题标题】:error: constexpr variable 'struct2Var' must be initialized by a constant expression错误:constexpr 变量 'struct2Var' 必须由常量表达式初始化
【发布时间】:2020-01-07 13:50:40
【问题描述】:

以下程序在使用 Clang 编译时失败,错误:constexpr variable 'struct2Var' must be initialized by an constant expression {var, 2100433} .

如果我从“var”声明中删除__attribute__((weak)),它会毫无问题地通过。

谁能解释一下这个错误背后的理论/原因。

struct myStruct
{
public:
 constexpr operator const wchar_t*() const
 {
  return &m_cch;
 }

 const wchar_t m_cch;
};

extern  __attribute__((weak)) const constexpr myStruct var {'a'};

struct myStruct2
{
 const wchar_t* stzKey = nullptr;

 int intvar = 0;
};

static constexpr const myStruct2 struct2Var[1]
{
  {var, 2100433}
};

【问题讨论】:

标签: c++ compilation clang


【解决方案1】:

看起来使用__attribute__((weak)) 会丢弃带有clang 但不带有gcc 的constexpr 限定符。尽管 clang 试图成为 gcc 的替代品,但它可能会以不同的方式实现这种非标准功能。在那种情况下,我会说 gcc 和 clang 都没有错。

此外,全局constexpr 可能难以维护,因为它们都应该在每个翻译单元中统一定义。为了解决这个问题,c++17 中添加了inline variable

【讨论】:

  • 看来你是对的。我可能需要确认一下。感谢 Meatboy 提供的重要信息。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2021-09-14
  • 2023-01-02
相关资源
最近更新 更多