错误:constexpr 变量'struct2Var'必须由常量表达式初始化
error: constexpr variable 'struct2Var' must be initialized by a constant expression
以下程序在使用 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 中。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用自动推导的 lambda 参数作为常量表达式
- 生成提升::hana::set 的常量表达式问题
- 为什么不能用常量表达式声明数组?
- 不是 lambda 函数中的常量表达式
- 函数调用在常量表达式中必须具有常量值
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 关于在需要常量表达式的上下文中使用的glvalue常量表达式的问题
- 生成 constexpr 字符串表,不能产生常量表达式
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:'new'不能出现在常量表达式中
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- C++ 使用变量而不是常量表达式初始化数组
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"