繁体   English   中英

C ++规范是否说明了如何在static_cast / const_cast链中选择类型以用于C风格的转换?

[英]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_castT 绘制算法的:取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_castconst_cast (我还没有深入研究过载解析的深处(我有,但不是针对这个问题))。 但是我们可以使用蛮力反复删除const / volatile并检查每种类型是否真正需要。 因此,从理论上讲,没有歧义或规格不足。 如果有铸造链,就可以确定。 在实践中,可以使该算法非常简单,因为(可以肯定)我们可以从T构造的“最具有cv资格”类型就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM