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.这段代码是否格式良好?如果没有,为什么不呢?
这是核心问题909:
根据5.4 [expr.cast]第4段,对旧式演员的一种可能的解释是
static_castaconst_cast.因此,人们会期望以下示例中标记为#1和#2的表达式具有相同的有效性和含义:Run Code Online (Sandbox Code Playgroud)struct S { operator const int* (); }; void f(S& s) { const_cast<int*>(static_cast<const int*>(s)); // #1 (int*) s; // #2 }但是,许多实现在#2上发出错误.
(T*)x应该被解释为类似的意图Run Code Online (Sandbox Code Playgroud)const_cast<T*>(static_cast<const volatile T*>(x))理由(2009年7月):
根据对措辞的直截了当的解释,这个例子应该有效.这似乎只是一个编译器错误.
这显然从未被Clang和GCC解决过.是时候打开门票了.
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |