Таинственное поведение static_cast - PullRequest
1 голос
/ 01 января 2012

Я пытаюсь реализовать класс числовых векторов. Я использую шаблон Qt QVector, который похож на вектор STL

typedef float ArithmeticF;
typedef QVector<ArithmeticF> VectorFloat;

class VectorF : public VectorFloat
{
/// appends the rightSide to the end
VectorF& operator << (const VectorF& rightSide);
}

Меня смущает то, что

VectorF& VectorF::operator << (const VectorF& rightSide)
{
static_cast<VectorFloat>(*this) <<  static_cast<VectorFloat>(rightSide);
return *this;
}

не работает вообще. Я попытался отладить его построчно, и VectorFloat :: operator << не вызывается вообще. Ошибок нет, программа компилируется и запускается, но ничего не делает. Однако это работает: </p>

VectorF& VectorF::operator << (const VectorF& rightSide)
{
VectorFloat a = static_cast<VectorFloat>(*this);
VectorFloat b = static_cast<VectorFloat>(rightSide);
a << b;
*this = VectorF(a);
return *this;
}

Мне просто любопытно, почему это так. Я попытался покопаться в команде static_cast, но не могу понять.

Пожалуйста, помогите мне.

1 Ответ

3 голосов
/ 01 января 2012

Вы приводите к типу значения VectorFloat, который создает копию вашего объекта *this и применяет к нему оператор <<. Этот временный объект быстро уничтожается, и, таким образом, ничего заметного не наблюдается.

Вы должны привести к ссылке VectorFloat& вместо:

static_cast<VectorFloat&>(*this) <<  static_cast<VectorFloat>(rightSide);

Тот факт, что второй пример работает, легко объясним. Вы сохраняете скопированный объект в переменной a и восстанавливаете свой VectorF на основе этой измененной копии. По пути выполняется слишком много операций (преобразование в VectorFloat, преобразование обратно в VectorF, присвоение в *this), но на практике это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...