C++转换无法处理的C风格转换方式

8
据说 C 风格的转换只是尝试应用不同组合的 C++ 转换,然后使用第一个允许的组合。然而,我有一种感觉,听说有些情况只有 C 风格的转换可以处理,而任何 C++ 转换的组合都不被允许。
我错了吗?在 C++ 中,任何 上下文中的 任何 C 风格转换都可以被适当的 C++ 转换组合替代吗? 更新 感谢 Cheers and hth. - Alf,我们有一个例子表明 C++ 转换无法处理,因为它们不能产生 定义的预期的 行为。进阶问题是提供一个示例,其中 C++ 转换无法处理,这意味着它甚至不能被 编译

1
我有一种感觉,听说有些情况只有C风格的转换可以处理,而不允许使用任何C++转换的组合。我怀疑你听到的是C允许一些C++不允许的转换。这与C++转换中C风格转换的含义无关。然而,我手头没有例子。 - John Bollinger
当然不会,那样会使C++风格的转换变得低劣。 - emlai
1
<resists the impulse to start a language war> - John Bollinger
1
难道不总是有 reinterpret_cast 吗? - CompuChip
1
@CompuChip 不行,reinterpret_cast 甚至不能做一些 static_cast 能做的事情,而这两者都与 const_cast 毫不相关。 - Mikhail
显示剩余3条评论
1个回答

11

将向不可访问的基类转换只能使用C样式的强制类型转换(其中一种语法变体)来表示。在这种情况下,它等价于一个static_cast,它可能会改变地址,但static_cast不能访问该基类。

示例:

struct Base
{
    int x = 42;
};

struct Oh_my
    : private Base
{
    virtual ~Oh_my() {}
};

#include <iostream>
using namespace std;
auto main() -> int
{
    Oh_my o;
    cout << "C cast: " << ((Base&)o).x << endl;
    cout << "reinterpret_cast: " << reinterpret_cast<Base&>(o).x << endl;
}

在Windows 7中使用MingW g++的输出:

C类型转换: 42
reinterpret_cast: 4935184

但由于这是一种不确定行为,最后一个输出操作可能会导致程序崩溃。


1
如果有这样的代码:struct A { int i; }; struct B { int i; }; struct C : private A, private B { };,那么从 C *A * 或者 B * 的 C 风格转换将会成功,而 static_cast 将会失败,reinterpret_cast 至少会得到其中一个错误的结果。 - user743382
1
@hvd:没错,这就是我想到的情况。reinterpret_cast 可以工作,但它需要指针算术和对编译器内部的了解,所以我认为它属于“C++转换无法处理”的范畴。 - Mooing Duck
2
虚析构函数的目的是什么?如果我将其删除,使用两种转换方式得到的输出结果相同。 - emlai
4
和 @hvd 的多重继承一样,实际上保证基类子对象(至少一个)不与最终派生对象位于相同的地址。 - Cheers and hth. - Alf
1
@Mikhail:我很确定reinterpret_cast会为任何C可以转换的内容编译,假设每个类型都是相同的。 - Mooing Duck
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接