什么时候强制转换调用新类型的构造函数?

Man*_*rse 20 c++ casting

确定特定static_cast是否会调用类的构造函数的规则是什么?c风格/功能风格演员怎么样?

Jam*_*nze 13

每次创建新对象时,都会调用构造函数.A static_cast总是会立即产生一个新的临时对象(但请参见James McNellis的评论),或者通过调用用户定义的转换.(但是为了返回所需类型的对象,用户定义的转换运算符必须调用构造函数.)

当目标是类类型时,根据定义,C样式转换和具有单个参数的功能样式转换与a相同 static_cast.如果函数样式转换具有零个或多个参数,则它将立即调用构造函数; 在这种情况下,不考虑用户定义的转换运算符.(人们可能会质疑将其称为"类型转换"的选择.)

对于记录,可能会调用用户定义的转换运算符:

class A
{
    int m_value;
public
    A( int initialValue ) : m_value( initialValue ) {}
};

class B
{
    int m_value;
public:
    B( int initialValue ) : m_value( initialValue ) {}
    operator A() const { return A( m_value ); }
};

void f( A const& arg );

B someB;
f( static_cast<A>( arg ) );
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,演员阵容是不必要的,并且在不存在的情况下将隐式地进行转换.但在所有情况下:将调用隐式转换,static_castC样式cast((A) someB)或函数样式cast(A( someB )) B::operator A().)

  • "``static_cast`总是导致一个新的临时对象"是不正确的.作为一个例子,给定类层次结构`struct B {}; struct D:B {};`,以下`static_cast`不创建新对象:`D d; B&b(static_cast <B&>(d));`.目标类型是对象类型的任何`static_cast`都将创建一个新对象. (3认同)

Jam*_*lis 12

只要创建了该类型的新实例,就会调用类类型的构造函数.如果强制转换创建该类类型的新对象,则调用构造函数.重载决策确定在给定特定参数的情况下调用类类型的哪个构造函数.

如果a的目标类型static_cast是类类型,它将创建目标类型的新对象.

A const_cast,, dynamic_castreinterpret_cast永远不会创建新的类类型对象,因此永远不会调用构造函数.

由于C样式转换始终执行的某种组合static_cast,const_cast以及reinterpret_cast,它会创建一个相同的情况下一个新的对象static_cast将创建一个新的对象.