clang 拒绝 gcc 允许的这段代码:
int main() {
static constexpr const void *vp = nullptr;
static constexpr const char *cp = static_cast<const char*>(vp);
}
具有以下内容:
error: constexpr variable 'cp' must be initialized by a constant expression
static constexpr const char *cp = static_cast<const char*>(vp);
阅读 N3797 5.9/2 中的最终列表后,我没有看到任何禁止在常量表达式中使用
static_cast
的内容。我是不是看错地方了或者误读了什么?或者我应该针对 clang 打开一个 bug?
好吧,C++14 标准(以及您的(非最终)草案!)强制要求
A 条件表达式
是核心常量表达式,除非 遵循抽象机的规则对e
进行评估 (1.9),将计算以下表达式之一:e
—从类型 cv
到对象指针类型的转换;void *
从 C++ 26 开始,只要编译器知道指针指向您要转换到的确切类型的对象即可。 截至撰写本文时,它已经在 Clang trunk 中实现。