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

Bri*_*ian 27 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{});
}
Run Code Online (Sandbox Code Playgroud)
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风格的演员表可以执行a static_cast后跟a 执行的转换const_cast.这段代码是否格式良好?如果没有,为什么不呢?

Col*_*mbo 9

这是核心问题909:

根据5.4 [expr.cast]第4段,对旧式演员的一种可能的解释是static_casta 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

const_cast<T*>(static_cast<const volatile T*>(x))
Run Code Online (Sandbox Code Playgroud)

理由(2009年7月):

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

这显然从未被Clang和GCC解决过.是时候打开门票了.