static_cast用于用户定义的类型

pic*_*c11 7 c++

是否可能以及为什么要这样做?

class Foo;
class Bar;

......

Foo foo;
Bar bar = static_cast<Bar>(foo);
Run Code Online (Sandbox Code Playgroud)

通常,static_cast与数字类型和指针一起使用,但它是否可以使用用户定义的数据类型,即类?

Naw*_*waz 11

Bar bar = static_cast<Bar>(foo);
Run Code Online (Sandbox Code Playgroud)

这个演员会失败.Foo并且Bar是不兼容的类型,除非至少满足下列条件之一:

  • Foo源自Bar,或
  • Bar有一个构造函数Foo,或者
  • Foo有一个用户定义的转换Bar.

这里更大的问题不是它是否会成功投射.更大和更实际的问题应该是:你想从这样的演员阵容中得到什么?你为什么要首先做这样的事情?该怎么办?我的意思是,如何BarFoo对象初始化对象?

将一种类型转换为另一种类型的合理方法是以下方式之一:

定义Foo为:

class Foo : public Bar
{
   //...
};
Run Code Online (Sandbox Code Playgroud)

或者定义Bar为:

class Bar
{
  public: 
       Bar(const Foo &foo); //define this constructor in  Bar!
};
Run Code Online (Sandbox Code Playgroud)

或者提供转换功能Foo:

class Foo
{
  public: 
       operator Bar(); //provide a conversion function Foo to Bar!
};
Run Code Online (Sandbox Code Playgroud)


Arm*_*yan 11

这是规则:

static_cast<T>(e)当且仅当以下变量定义有效时,表达式才有效

T x(e);
Run Code Online (Sandbox Code Playgroud)

x一些发明的变量在哪里.

因此,通常,两个不相关的类型不能彼此强制转换.但是,如果一个类型是从另一个类型派生的,或者当一个类型为另一个类型定义转换函数,或者构造函数采用另一个类型的单个参数时 - 在这些情况下,static_cast将被很好地定义.

它有意义吗?例如,如果T定义一个构造函数的单一U和构造是explicit然后static_cast<T>(e)其中e是类型的ü将使完美的意义