是否可能以及为什么要这样做?
class Foo;
class Bar;
......
Foo foo;
Bar bar = static_cast<Bar>(foo);
通常,static_cast与数字类型和指针一起使用,但它是否可以与用户定义的数据类型一起使用,a.k.a类?
答案 0 :(得分:11)
以下是规则:
当且仅当以下变量定义有效时,表达式static_cast<T>(e)
才有效
T x(e);
其中x
是一个发明变量。
因此,通常,两个不相关的类型不能相互转换。但是,如果一个类型派生自另一个类型,或者一个类型定义了另一个类型的转换函数,或者构造函数采用另一个类型的单个参数 - 在这些情况下,static_cast将被很好地定义。
它有意义吗?例如,如果T定义了一个构造函数,它接受一个U而构造函数是explicit
,那么static_cast<T>(e)
其中e是U类型将是完全合理的
答案 1 :(得分:10)
Bar bar = static_cast<Bar>(foo);
此演员表将失败。 Foo
和Bar
是不兼容的类型,除非至少满足下列条件之一:
Foo
派生自Bar
,或Bar
有一个带Foo
或Foo
具有用户定义的Bar
转换。 这里更大的问题不是它是否会成功投射。更大和更实际的问题应该是:你想从这样的演员阵容中得到什么?你为什么要首先做这样的事情?该怎么办?我的意思是,如何从Bar
对象初始化Foo
对象?
将一种类型转换为另一种类型的合理方法是以下方式之一:
将Foo
定义为:
class Foo : public Bar
{
//...
};
或将Bar
定义为:
class Bar
{
public:
Bar(const Foo &foo); //define this constructor in Bar!
};
或者在Foo
中提供转换功能:
class Foo
{
public:
operator Bar(); //provide a conversion function Foo to Bar!
};