static_casting 的结果是 constexpr void* 常量表达式吗?

问题描述 投票:0回答:2

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++ clang language-lawyer c++14 constexpr
2个回答
8
投票

好吧,C++14 标准(以及您的(非最终)草案!)强制要求

A 条件表达式

e
是核心常量表达式,除非 遵循抽象机的规则对
e
进行评估 (1.9),将计算以下表达式之一:

—从类型 cv

void *
到对象指针类型的转换;


0
投票

从 C++ 26 开始,只要编译器知道指针指向您要转换到的确切类型的对象即可。 截至撰写本文时,它已经在 Clang trunk 中实现。

详细信息在此答案中

© www.soinside.com 2019 - 2024. All rights reserved.