在C ++中,C风格的演员可以调用转换函数然后抛弃constness吗?

时间:2016-08-29 21:00:13

标签: c++ language-lawyer

GCC和Clang都拒绝接受以下代码中的C风格演员。

http://coliru.stacked-crooked.com/a/c6fb8797d9d96a27

struct S {
    typedef const int* P;
    operator P() { return nullptr; }
};
int main() {
    int* p1 = const_cast<int*>(static_cast<const int*>(S{}));
    int* p2 = (int*)(S{});
}
main.cpp: In function 'int main()':
main.cpp:7:25: error: invalid cast from type 'S' to type 'int*'
     int* p2 = (int*)(S{});
main.cpp:7:15: error: cannot cast from type 'S' to pointer type 'int *'
    int* p2 = (int*)(S{});
              ^~~~~~~~~~~

但是,根据标准,C风格的演员表可以执行static_cast后跟const_cast执行的转换。这段代码是否格式良好?如果没有,为什么不呢?

1 个答案:

答案 0 :(得分:9)

这是core issue 909

  

根据5.4 [expr.cast]第4段,一种可能的解释   旧式演员阵容的格式为static_cast,后跟const_cast。一   因此,我希望表达式中标记为#1和#2的表达式   以下示例具有相同的有效性和含义:

struct S {
  operator const int* ();
};

void f(S& s)  {
  const_cast<int*>(static_cast<const int*>(s));  // #1
  (int*) s;  // #2
}
     

但是,许多实现在#2上发出错误。

     

(T*)x的意图应该被解释为

const_cast<T*>(static_cast<const volatile T*>(x))
     

理由(2009年7月):

     

根据对措辞的直截了当的解释,这个例子应该有效。这似乎只是一个编译器错误。

显然,Clang和GCC都没有解决这个问题。是时候打开门票了。

相关问题