C++ 错误:constexpr变量“struct2Var”必须由常量表达式初始化

C++ 错误:constexpr变量“struct2Var”必须由常量表达式初始化,c++,compilation,clang,C++,Compilation,Clang,使用Clang编译时,以下程序失败,出现错误:constexpr变量“struct2Var”必须由常量表达式{var,2100433}初始化 . 如果我从var声明中删除_属性_弱,那么它的传递没有任何问题 谁能解释一下这个错误背后的理论/原因吗 struct myStruct { public: constexpr operator const wchar_t*() const { return &m_cch; } const wchar_t m_cch; }; ex

使用Clang编译时,以下程序失败,出现错误:constexpr变量“struct2Var”必须由常量表达式{var,2100433}初始化 .

如果我从var声明中删除_属性_弱,那么它的传递没有任何问题

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

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}
};
看起来使用_属性_弱会丢弃带有clang的constexpr限定符,但不会丢弃带有gcc的constexpr限定符。尽管clang试图成为gcc的替代品,但它可能以不同的方式实现这种非标准特性。在这种情况下,我想说gcc和clang都没有错

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

看起来使用_属性_弱将丢弃带有clang的constexpr限定符,而不使用gcc。尽管clang试图成为gcc的替代品,但它可能以不同的方式实现这种非标准特性。在这种情况下,我想说gcc和clang都没有错


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

无法复制:这里是复制:您应该将您的问题指向gcc和clang具有不同行为的事实。这是一个重要的细节。简化版:无法复制:这里是复制:你应该回答你的问题,指出gcc和clang有不同的行为。这是一个重要的细节。简化版:看来你是对的。我可能需要确认一下。谢谢肉男提供的大量信息。看来你是对的。我可能需要确认一下。谢谢肉男孩提供的大量信息。