tem*_*def 14 c++ casting language-lawyer
这个问题涉及我在C++规范中注意到的事情,当我试图回答这个问题时,有关C风格的转换和类型转换的有趣问题.
C++规范在§5.4中讨论了C风格的演员表.它表示强制转换符号将按此顺序尝试以下强制转换,直到找到一个有效:
const_caststatic_caststatic_cast 其次是 const_castreinterpret_castreinterpret_cast接着是const_cast.虽然我有意味着什么,使用一个伟大的直观的想法static_cast,然后一const_cast(例如,在转换const Derived*到Base*通过一个去const_cast<Base*>(static_cast<const Base*>(expr)),我没有看到任何规范写法怎么说,具体而言,使用的类型)在static_cast/ const_cast系列中将被推断.在简单指针的情况下,它并不那么难,但正如链接问题中所见,如果const在一个地方引入额外内容并在另一个地方删除附加内容,则施法可能会成功.
是否有任何规则来管理编译器如何确定在铸造链中使用哪些类型?如果是这样,他们在哪里?如果不是,这是语言中的缺陷,还是有足够的隐式规则来唯一确定要尝试的所有可能的强制转换?
如果不是,这是否是语言中的缺陷,或者是否有足够的隐式规则来唯一确定要尝试的所有可能的强制转换?
仅使用 构造可以转换为目标类型的所有类型(const_cast即所有“中间类型”)怎么样?
给定目标 type T,如果static_cast不起作用,请识别可以添加 cv 限定符的所有位置,以便可以将结果类型强制转换T回const_cast1。算法草图:对 进行 cv 分解 ( [conv.qual]/1 ) T;每个cv j都可以被扩充。如果T是推荐人,我们可以增强推荐人类型的简历资格。
现在添加const volatile到所有这些地方。调用结果类型CT。尝试使用static_casting 表达式来CT代替。如果可行,我们的转换链就是const_cast<T>(static_cast<CT>(e))。
如果这不起作用,则很可能没有使用static_cast后跟进行转换const_cast(我还没有深入研究重载解析的深层次(嗯,我有,但不是针对这个问题))。但如果我们真的想要的话,我们可以使用暴力来重复删除const/volatile并检查每种类型。所以理论上来说,不存在歧义或不明确的情况;如果有一些施法链,就可以确定。在实践中,该算法可以变得非常简单,因为我们可以构造的“最符合 cv 条件”的类型T(肯定)就足够了。