c++ - static_cast 的神秘行为

标签 c++ qt operators static-cast

我正在尝试实现一类数值 vector 。我正在使用类似于 STL vector 的 Qt 模板 QVector

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<< 根本没有被调用。没有错误,程序编译并运行,但什么也不做。然而这有效:

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 命令,但我无法理解。

请帮帮我。

最佳答案

您正在转换为值类型 VectorFloat ,它会复制您的 *this对象并应用 <<运算符(operator)给它。该临时对象会立即被销毁,因此无法观察到任何影响。

您应该转换为引用 VectorFloat&相反:

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

第二个示例有效的事实很容易解释。您正在将复制的对象存储在 a 中变量,你正在重建你的 VectorF基于这个修改后的拷贝。一路上完成了太多操作(转换为 VectorFloat ,转换回 VectorF ,分配给 *this ),但实际上它有效。

关于c++ - static_cast 的神秘行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692737/

相关文章:

c++ - 为什么在使用解除引用的指针时 EXPECT_CALL 测试意外通过?

c++ - 如何填补 OpenCV 中二进制图像中的空白?

objective-c - 用三元运算符替换 If 语句

python - 在python中将属性添加到int值

c++ - 线程化 OpenGL 与 Qt 5.1 共享 QGLWidgets 问题

c++ - 宏操作符列表

c++ - 使用仿函数提供函数或运算符作为 C++ 模板参数的性能损失?

c++ - 完成虚拟继承

c++ - Qt Qvariantlist转换成javascript数组不成功

qt - QMAKE 在 make 文件的 lib 路径中添加额外的引号