静态施法是否被滥用? 我对 STATICORCAST 有复杂的感情,因为它是最安全的C++编译器,但同时允许安全和不安全的转换,所以你必须知道上下文来说明它是否确实安全或者可能导致UB(例如当铸造到子类)。

静态施法是否被滥用? 我对 STATICORCAST 有复杂的感情,因为它是最安全的C++编译器,但同时允许安全和不安全的转换,所以你必须知道上下文来说明它是否确实安全或者可能导致UB(例如当铸造到子类)。,c++,casting,type-safety,static-cast,C++,Casting,Type Safety,Static Cast,那么为什么没有更安全的显式演员阵容呢?下面是一个例子,在这里它可能是有用的。在COM中,它们必须以void**ppv的形式返回接口指针,因此“have to”必须显式强制转换 *ppv = (IInterface*) this; 这是建议用一个更安全的C++ Studio来代替的。 *ppv = static_cast<IInterface*>(this); 或者使用类似的助手 template<class T, class U> T implicit_cast(U

那么为什么没有更安全的显式演员阵容呢?下面是一个例子,在这里它可能是有用的。在COM中,它们必须以
void**ppv
的形式返回接口指针,因此“have to”必须显式强制转换

*ppv = (IInterface*) this;

这是建议用一个更安全的C++ Studio

来代替的。
*ppv = static_cast<IInterface*>(this);
或者使用类似的助手

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

*ppv = implicit_cast<IInterface*>(this);
模板
T隐式_-cast(up){return p;}
*ppv=隐式投影(本);
那么,
static\u cast
有时被误用,在某些情况下可以(应该?)被这个
implicit\u cast
替代,还是我遗漏了什么


编辑:我知道这一点,但它不必是静态的,一个隐式的强制转换就足够了。

在这种特殊情况下,我相信大家都知道强制转换是向上的,因此静态的强制转换应该是完全安全的

使用
implicit_cast
可能更安全,并允许您显式选择要隐式转换到的基类(这显然是COM所必需的)

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

但是请注意,关于您的第一句话,我认为
动态\u cast
实际上比
静态\u cast
更安全,因为如果无法完成转换,它将返回null或throw。相比之下,
static\u cast
将返回一个有效的指针,并允许您继续运行,直到您的程序在将来某个时候发生故障,与原始的错误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;
}
#包括
B1类
{
公众:
虚拟~B1(){}
};
B2类
{
公众:
虚拟~B2(){}
};
Foo类:公共B1、公共B2
{
};
模板
T隐式_-cast(up){return p;}
int main()
{
Foo*f=新的Foo;
无效**ppv=新的无效*;
*ppv=隐式铸造(f);

std::cout的确,
dynamic\u cast
会比
static\u cast
更安全,但我没有提到它,因为我从未见过它实际使用过(我听说性能受到了影响,但不知道它有多大)@ 7VIES:在VisualC++中,大约有2000个处理器周期,如果将COM对象转换为错误类型,编译器将无法捕获到您。在运行时,您只会得到一个空指针。@ SypTys:YEP:<代码> DyrimCype Studio绝对不是COM上下文中的最佳选项。我甚至不确定在哪种情况下它可以是一个好的选择。总之-在大多数情况下,它可以被运行时或编译时多态性所取代,而运行时或编译时多态性将更安全、更快。注意:有关
implicit\u 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;
}