移动构造函数的强制测试?

时间:2017-03-02 21:49:11

标签: c++ move-semantics

我正在为指向堆上的某些数据的对象实现移动构造/赋值操作。

我正在测试移动构造/分配和复制构造/分配,所有构建和除移动构造之外的所有工作。 (移动分配确实有效)。

我似乎无法使调试器跳闸,移动构造函数代码未到达。

我确定我缺少一些简单的东西?

移动构造函数......

//...

HeapBuffer (HeapBuffer&& other)                     // move
    : data {other.data},
      size {other.size}
{
    assert(false);              // hmm can't seem to debug to here in testing :(
    other.data = nullptr;
    other.size = 0;
}

//...

测试功能......

ado::HeapBuffer<2048> makeHeapBuffer2048()  // test move semantics
{
    ado::HeapBuffer<2048> hb2048;
    hb2048[777] = 123.0f;
    return hb2048;
}

主叫测试...

beginTest ("HeapBuffer move constructor");  // hmmm can't seem to get to the move constructor,
                                            // strange because all the others work!?!?
{
    ado::HeapBuffer<2048> hb {makeHeapBuffer2048()};

    expectEquals (hb[777], 123.0f);
}

如果我将移动构造函数更改为...

,我将添加
HeapBuffer (HeapBuffer&&) = delete;

......构建在预期点失败(即通过测试跳闸)。

1 个答案:

答案 0 :(得分:3)

可能会出现elision,你可以尝试:

ado::HeapBuffer<2048> moved;
moved[777] = 123.0f;
ado::HeapBuffer<2048> hb{std::move(moved)};

expectEquals (hb[777], 123.0f);