![](/img/trans.png)
[英]Why does this C-style cast not consider static_cast followed by const_cast?
[英]Does the C++ specification say how types are chosen in the static_cast/const_cast chain to be used in a C-style cast?
这个问题与我在尝试回答这个关于C样式转换和类型转换的有趣问题有关,我在C ++规范中注意到。
C ++规范在§5.4中讨论了C样式的强制转换。 它表示强制转换符号将按此顺序尝试以下强制转换,直到找到有效的转换为止:
const_cast
static_cast
static_cast
后跟const_cast
reinterpret_cast
reinterpret_cast
后跟const_cast
。 虽然我有意味着什么,使用一个伟大的直观的想法static_cast
后跟一个const_cast
(例如,一个转换const Derived*
一个Base*
通过一个持续const_cast<Base*>(static_cast<const Base*>(expr))
),我在规范中没有看到任何措辞说明如何具体推导static_cast
/ const_cast
系列中使用的类型。 对于简单的指针,这并不难,但是如链接的问题所示,如果在一个位置引入一个额外的const
并在另一个位置删除了一个const
则转换可能会成功。
是否有任何规则控制编译器应如何确定在转换链中使用哪种类型? 如果是这样,它们在哪里? 如果不是,这是否是语言的缺陷,或者是否存在足够的隐式规则来唯一确定所有可能的强制转换?
如果不是,这是否是语言的缺陷,或者是否存在足够的隐式规则来唯一确定所有可能的强制转换?
如何仅使用const_cast
构造所有可以const_cast
为目标类型的类型,即所有“中间类型”呢?
给定目标类型T
,如果static_cast
不起作用,请确定可以添加cv限定词的所有位置,以便由const_cast
1将结果类型const_cast
回T
绘制算法的:取CV-分解( [conv.qual] / 1 )的T
; 每个CV J的特征可以增强。 如果T
是参照,我们可以增加裁判类型的cv资格。
现在,将const volatile
添加到所有这些位置。 调用结果类型CT
。 尝试static_cast
将该表达式改为CT
。 如果const_cast<T>(static_cast<CT>(
,我们的演员表链就是const_cast<T>(static_cast<CT>(
e ))
。
如果这不起作用,则很可能没有使用static_cast
和const_cast
(我还没有深入研究过载解析的深处(我有,但不是针对这个问题))。 但是我们可以使用蛮力反复删除const
/ volatile
并检查每种类型是否真正需要。 因此,从理论上讲,没有歧义或规格不足。 如果有铸造链,就可以确定。 在实践中,可以使该算法非常简单,因为(可以肯定)我们可以从T
构造的“最具有cv资格”类型就足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.