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

时间:2015-04-17 22:11:19

标签: c++ clang language-lawyer c++14 constexpr

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的错误?

1 个答案:

答案 0 :(得分:7)

嗯,C ++ 14标准(以及你的(非最终)草案!)要求

  

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

     

- 从 cv void *类型转换为指向对象的指针类型;