Здравствуйте, wobist, Вы писали:
W>X x;
W>static_cast<T>(х)
W>static_cast<T &>(х)
W>Разные ли это преобразования?
Да, разные. В первом случае результат преобразования — это rvalue (скорее всего, потребуется конструирование временного объекта), во втором — lvalue.
W>...для X — базового, дочернего от Т типа
Проникнуть в смысл этой фразы у меня не получается
W>>потребуется конструирование временного объекта
На этапе компиляции?
B>Проникнуть в смысл этой фразы у меня не получается
struct X1 {};
struct X2: public X1 {};
X1 x1;
X2 x2;
//что правильно
x1 = static_cast<X1>(x2);//или
x1 = static_cast<X1 &>(x2);
static_cast<X1>(x2) = x1;//или
static_cast<X1 &>(x2) = x1;
Здравствуйте, wobist, Вы писали:
W>>>потребуется конструирование временного объекта
W>На этапе компиляции?
На этапе компиляции никаких объектов нет — ну, кроме интегральных констант.
B>>Проникнуть в смысл этой фразы у меня не получается
W>struct X1;
struct X2;
struct X1
{
X1() { cout << "X1::default ctor()" << endl; }
X1(const X1&) { cout << "X1::copy ctor(X1)" << endl; }
X1(const X2&) { cout << "X1::user ctor(X2)" << endl; } // если его нет, будет срезка источника и copy ctor
void operator=(const X1&) { cout << "X1::copy assign(X1)" << endl; }
void operator=(const X2&) { cout << "X1::user assign(X2)" << endl; }
};
struct X2 : X1
{
X2() { cout << "X2::default ctor()" << endl; }
X2(const X2&) { cout << "X2::copy ctor(X2)" << endl; }
X2(const X1&) { cout << "X2::user ctor(X1)" << endl; }
void operator=(const X2&) { cout << "X2::copy assign(X2)" << endl; }
void operator=(const X1&) { cout << "X2::user assign(X1)" << endl; }
};
W>X1 x1; // X1::default ctor()
W>X2 x2; // X2::default ctor()
W>x1 = static_cast<X1>(x2);
// X1::user ctor(X2) либо неявная срезка и X1::copy ctor(X1); создали временный объект-источник
// X1::copy assign(X1)
W>x1 = static_cast<X1 &>(x2);
// X1::copy assign(X1) - явная срезка источника
W>static_cast<X1>(x2) = x1;
// X1::user ctor(X2) либо X1::copy ctor(X1) - создали временный объект-приёмник
// X1::copy assign(X1)
W>static_cast<X1 &>(x2) = x1;
// X1::copy assign(X1) - явная срезка приёмника
W>