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

Is the result of static_casting a constexpr void* a constant expression?

本文关键字:常量 结果是 表达式 casting constexpr void static      更新时间:2023-10-16

>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 的内容。 我是否找错了地方或误读了什么?还是我应该打开一个针对叮当声的错误?

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

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

— 从 CV void * 类型转换为指向对象的指针类型;