这能保证是安全的演员阵容吗?
Is this guaranteed to be a safe cast?
本文关键字:安全 更新时间:2023-10-16
请考虑以下定义:
struct A {
// ...
};
struct B : public A {}; // empty
void f(B& b) { /* use b */}
void g(A& a) {
f(static_cast<B&>(a)); // is this a safe downcast?
}
int main() {
A a;
g(a);
}
在上面的例子中,a
实际上是A
的一个实例。
由于B
有一个空的定义,我想知道在这种特定情况下,对 f 的调用及其执行是否是未定义的行为。
不,这不是合法强制转换,因为它是在非类型 B
的对象上执行的。程序具有未定义的行为。
根据 C++11 标准第 5.2.9/2 段:
类型为">cv1
B
"的左值,其中B
是类类型,可以转换为类型"对 cv2D
的引用",其中D
是一个类 从B
派生(条款 10(,如果存在从"指向D
的指针"到"指向B
的指针"的有效标准转换 (4.10(, CV2 与 CV1 具有相同的 CV 资格,或比 CV1 更高的 CV 资格,并且B
既不是虚拟基类 的D
也不是D
的虚拟基类的基类。结果的类型为">cv2D
"。类型为">cv1B
"的 xvalue 可以转换为类型"对 cv2D
的右值引用",其约束与类型为">cv1B
"的左值相同。 如果类型为"cv1B
"的对象实际上是类型为D
对象的子对象,则结果是指封闭 类型D
的对象。否则,行为是未定义的
No.不管你说的安全是什么意思,那个强制转换是不正确的,真正的对象是类型 A
,而不是B
所以你不能向下投射到B
。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- C++动态安全 2D 交错阵列