Подтвердить что ты не робот

Когда броски вызывают конструктор нового типа?

Каковы правила, чтобы определить, вызовет ли какой-либо конкретный static_cast конструктор класса? Как насчет стилей стиля/функционального стиля c?

4b9b3361

Ответ 1

При каждом создании нового объекта вызывается конструктор. A static_cast всегда приводит к появлению нового временного объекта (но см. Комментарий Джеймса Макнеллиса) либо немедленно или посредством вызова определенного пользователем преобразования. (Но в чтобы вернуть объект желаемого типа, пользователь определил оператор преобразования должен будет вызвать конструктор.)

Когда цель - тип класса, стили стиля C и функциональный стиль касты с одним аргументом, по определению, такие же, как 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 ) );

В этом конкретном случае приведение не требуется, а преобразование будет сделана неявно в ее отсутствие. Но во всех случаях: неявный преобразование, static_cast, листинг стиля C ((A) someB) или функциональный (A( someB )), B::operator A() будет вызываться.)

Ответ 2

Конструктор для типа класса вызывается всякий раз, когда создается новый экземпляр этого типа. Если бросок создает новый объект этого типа класса, то вызывается конструктор. Разрешение перегрузки определяет, какие из конструкторов для типа класса называются заданными конкретными аргументами.

Если целевым типом static_cast является тип класса, он создаст новый объект целевого типа.

A const_cast, dynamic_cast или reinterpret_cast никогда не создадут новый объект типа класса и, следовательно, никогда не вызовут конструктор.

Так как листинг C-стиля всегда выполняет некоторую комбинацию static_cast, const_cast и reinterpret_cast, он создаст новый объект в тех же обстоятельствах, что static_cast создаст новый объект.

Ответ 3

Если есть подходящий конструктор преобразования, конструктор преобразования будет вызываться static_cast:

class Class {
public:
    Class( int ); //<< conversion constructor
};

int what = 0;
Class object = static_cast<Class>( what );

то же самое относится к стилям C-стиля и "функциональным" приведениям.

int what = 0;
Class object = (Class)what;

int what = 0;
Class object = Class( what );