C++static_cast下变频有效性
C++ static_cast downcast validity
此static_cast
下变频有效吗?
// non-virtual, may be non-trivially copyable
struct Base{
int m_object;
};
// Derived class have only non-virtual functions
struct A : Base{
void arggh(){
std::cout << "Arrghh " << m_object;
}
};
int main() {
Base base{190};
A& a = static_cast<A&>(base);
a.arggh();
return 0;
}
我的意思是,创建基类,然后转换为派生类。
实时
static_cast
不执行任何安全检查。由于Base&
可能引用A
的实例,强制转换继续进行,并且由于它实际上引用的是A
,因此我们进入未定义的行为区域*。
dynamic_cast
则更安全。在引用强制转换的情况下,它将执行检查并抛出异常,或者在指针强制转换†的情况下返回nullptr
。
然而,由于基类缺少任何虚拟函数,dynamic_cast
是不可能的,因此您需要至少使用一个虚拟析构函数来修改它:
class Base{
public:
int m_object;
virtual ~Base()=default;
};
现在,如果我们尝试铸造:
A* a = dynamic_cast<A*>(&base);
if (a)
a->arggh();
else
std::cout << "nulln";
我们的输出将是
空
*相关标准可在[expr.static.cast]中找到:
[对于类似
static_cast<D&>(b)
的类型转换,其中b
是D
的基类的实例],如果类型为">cv1B
"的对象实际上是类型为D
的对象的基类子对象,则结果引用类型为D
的封闭对象。否则,行为是未定义的。
†[expr.dynamic.cast]的相关标准
转换为指针类型失败的值是所需结果类型的空指针值。未能转换为引用类型将引发与类型的处理程序匹配的类型的异常
std::bad_cast
否。
并非所有的Base
对象都是A
1类型,尽管相反,并且static_cast
将在方向上工作。
1另一个翻译单元可能有一个继承自Base
的类。
一点也不。
假设Base在内存中由这个块[-]表示,A是[-+],在这里你可以看到A包含一个部分Base(带小'-')。
当你创建一个Base时,你有你的[-],然后你把它铸造成a,这意味着你说它实际上是[-+],但[-]之后的内存与[-+]不对应
正如您在本例中所理解的,您可以将A强制转换为Base,因为[-+]包含[-]
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 如何检查类中共享指针的有效性?
- 列表的有效性在插入后开始迭代器
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- lambda 函数返回值的有效性
- 提升图形库:以高性能的方式检查vertex_descriptor的有效性
- 没有迭代器失效是否意味着推进迭代器的有效性?
- 运算符返回的指针的有效性 >
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- QUdpSocket 失去有效性
- QTreeWidgetItem 析构函数和 QTreeWidgetItemIterator 有效性
- 模板化代码的有效性是什么意思
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)