Ответ 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()
будет вызываться.)