gpt4 book ai didi

c++ - static_cast 被滥用了吗?

转载 作者:IT老高 更新时间:2023-10-28 22:41:32 27 4
gpt4 key购买 nike

我对static_cast 的感受很复杂,因为它是可用的最安全的 C++ 强制转换,但同时允许安全和不安全转换,所以你必须知道上下文来说明它是否真的安全或可能导致 UB(例如,当强制转换为子类时)。

那么为什么没有更安全的显式转换呢?这是一个示例,它可能有用。在 COM 中,它们必须将接口(interface)指针返回为 void** ppv ,所以“必须”明确地转换

*ppv = (IInterface*) this;

后来建议用更安全的 C++ 强制转换

*ppv = static_cast<IInterface*>(this);

但是,即使是 static_cast 也有意义吗?这里? this是派生自 IInterface 的类,所以可以简单地写

IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;

或使用类似的助手

template<class T, class U>
T implicit_cast(U p) { return p; }

*ppv = implicit_cast<IInterface*>(this);

那么,static_cast 是真的吗?有时会被误用,可以(应该?)替换为 implicit_cast在某些情况下,还是我错过了什么?

编辑:我知道 a cast is required in COM , 但不一定是 static_cast ,隐式转换就足够了。

最佳答案

在这种特殊情况下,我相信总是知道强制转换会向上,因此 static_cast 应该是完全安全的。

看起来使用你的 implicit_cast 可能会更安全,并且允许你显式选择你想要隐式转换到的基类(这显然是 COM 所必需的)。

我用 g++ 做了一个快速测试,implicit_cast 确实按预期返回了不同基类的不同地址。

但是请注意,关于您的第一句话,我认为 dynamic_cast 实际上比 static_cast 更安全,因为它会返回 null 或 throw 如果 Actor 可以'没有完成。相比之下,static_cast 将返回一个看起来有效的指针,让您继续运行,直到您的程序在未来某个时间崩溃,与原始的错误转换无关。

测试程序:

#include <iostream>

class B1
{
public:
virtual ~B1() {}
};

class B2
{
public:
virtual ~B2() {}
};

class Foo : public B1, public B2
{
};

template<class T, class U>
T implicit_cast(U p) { return p; }

int main()
{
Foo* f = new Foo;
void **ppv = new void*;

*ppv = implicit_cast<B1*>(f);
std::cout << *ppv << std::endl;;
*ppv = implicit_cast<B2*>(f);
std::cout << *ppv << std::endl;;

return 0;
}

关于c++ - static_cast 被滥用了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957739/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com