c++ - C 风格的转换可以处理,但 C++ 转换不能

标签 c++ c casting

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

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

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

最佳答案

Cast to unaccessible base 只能表示为 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

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

关于c++ - C 风格的转换可以处理,但 C++ 转换不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33899978/

相关文章:

java - 将消息从 C++ 服务器发送到 Java 客户端

将字符转换为短字符

C++ 将大量 vector 加倍转换为字符 vector 的最有效方法

C++ 自定义模板 LinkedList 崩溃添加 std::string

c++ - 在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

c++ - 为什么我的返回 lambda 的函数似乎被转换为转换 int 的函数?

c++ - 不使用 '/' 运算符的除法

c - 定义一个大于 unsigned int 限制的大型数组

c++ - 在实现继承中,来自多个层的数据成员是否连续分配?

c# - 在 C# 中,您可以将一个泛型类型转换为另一个泛型类型吗?谁的 T 参数是第一个 T 的子类?