不会。 AC cast 可以做相当于 a const_cast
、 a static_cast
、 areinterpret_cast
或它们的组合。如果这还不够,它还可以完成至少一个新演员组合根本无法做到的小技巧!
如果原始变量没有定义,则可以使用const_cast
with defined results const
,但您所拥有的只是const
对该对象的指针或引用。OTOH,如果您认为自己有充分的理由使用 a const_cast
,那么您很可能应该真正抬头mutable
。
编辑:我想我应该马上说出来,但是 C 风格的转换可以转换为一个不可访问的基类。例如,考虑以下内容:
[编辑:我将代码更新为可以编译和(通常)演示问题的代码。]
#include <iostream>
class base1 {
public:
virtual void print() { std::cout << "base 1\n"; }
};
class base2 {
public:
virtual void print() { std::cout << "base 2\n"; }
};
class derived : base1, base2 {}; // note: private inheritance
int main() {
derived *d = new derived;
base1 *b1 = (base1 *)d; // allowed
b1->print(); // prints "base 1"
base2 *b2 = (base2 *)d; // also allowed
b2->print(); // prints "base 2"
// base1 *bb1 = static_cast<base *>(d); // not allowed: base is inaccessible
// Using `reinterpret_cast` allows the code to compile.
// Unfortunately the result is different, and normally won't work.
base1 *bb2 = reinterpret_cast<base1 *>(d);
bb2->print(); // may cause nasal demons.
base2 *bb3 = reinterpret_cast<base2 *>(d);
bb3->print(); // likewise
return 0;
}
使用reinterpret_cast
s 的代码将编译 - 但尝试使用结果(至少两者之一)将导致重大问题。reinterpret_cast
获取派生对象的基地址并尝试将其视为指定类型的基对象——并且由于(至多)一个基对象实际上可以存在于该地址,因此尝试将其视为另一个可以/将导致重大问题。编辑:在这种情况下,除了打印的内容之外,这些类基本上是相同的,所以尽管任何东西都可以发生,对于大多数编译器,最后两个都会打印出“base 1”。reinterpret_cast 获取该地址中发生的任何内容并尝试将其用作指定的类型。在这种情况下,我(试图)让它做一些无害但可见的事情。在实际代码中,结果可能不会那么漂亮。
如果代码使用公共继承而不是私有继承,C 风格的强制转换将像 static_cast 一样工作——即它知道每个基类对象在派生类中“存在”的位置,并调整结果,因此每个结果指针都会工作,因为它已被调整为指向正确的位置。