C样式转换可以处理的转换,但C ++转换不能

时间:2015-11-24 17:21:27

标签: c++ c casting

It is said C样式演员只是尝试应用不同的C ++演员组合,并使用第一个允许的组合。但是,我有一种感觉,我听说有些情况只有C风格的强制转换可以处理,而C ++强制转换的组合都不允许。

我错了吗?在任何上下文(在C ++中)的任何 C样式转换是否可以用适当的C ++转换组合替换?

UPD 感谢Cheers and hth. - Alf,我们有一个C ++强制转换无法处理的示例,意思是它们无法生成已定义预期行为。高级问题是提供一个C ++强制转换无法处理意味着它甚至不能编译的示例?

1 个答案:

答案 0 :(得分: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 cast: 42
reinterpret_cast: 4935184

但由于它是非常未定义的行为,最后一次输出操作可能会崩溃。