通过placement new访问static constexpr成员是否属于常量表达式?
结论
Clang的行为符合C标准规范,GCC和MSVC属于对规则做了放宽的非标准实现,给出的代码本身不符合C规范要求。
具体原因
- 按照C++标准的语义规则,
p->foobar完全等价于(*p).foobar,哪怕foobar是类的静态成员,语法层面也必须先完成对指针p的解引用操作,再查找对应成员。 static_assert的操作数必须是合法的常量表达式,常量表达式的求值过程不允许对非constexpr的指针变量执行解引用操作。示例代码里的p是main函数内定义的局部自动变量,本身不属于常量表达式,对它执行解引用的步骤已经违反了常量表达式的要求,所以Clang的报错是合理的。
修复建议:静态成员属于类维度的成员,不需要通过对象或指针访问,直接写
static_assert(bar::foobar == 42);即可符合规范,所有编译器都能正常编译通过。
内容的提问来源于stack exchange,提问作者Jake Schmidt
相关产品推荐
相关产品推荐

