错误:constexpr 变量'struct2Var'必须由常量表达式初始化

error: constexpr variable 'struct2Var' must be initialized by a constant expression

本文关键字:常量 表达式 初始化 constexpr 错误 struct2Var 变量      更新时间:2023-10-16

以下程序在使用 Clang 编译时失败并出现错误:constexpr 变量 'struct2Var' 必须由常量表达式 {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}
};

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

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