在这种情况下正确使用移动语义?

时间:2014-06-06 04:30:01

标签: c++ c++11

如果标题有点模糊,我们很抱歉;我将尝试通过一些例子澄清它。假设我有一个类Foo,它包含一个init方法:

class Foo{
    auto init(const BigMemoryHungryType& t) -> void {
        //do a ton of stuff
    }
};

现在假设我想创建这个init方法的重载,这次接受类型为BigMemoryHungryType的rvalue,这样我就可以简单地执行移动语义:

class Foo{
    auto init(const BigMemoryHungryType& t) -> void {
        //do a ton of stuff
    }

    auto init(BigMemoryHungryType&& t) -> void {
        //exact same as other init, but utilizing move semantics
    }

};

我怎样才能将复制粘贴保持在最低限度?我想到的方法涉及在两个init方法中分配所有成员,然后调用protected / private init方法来完成实际工作:

class Foo{
    auto init(const BigMemoryHungryType& t) -> void {
        real_t = t;
        init();
    }

    auto init(BigMemoryHungryType&& t) -> void {
        real_t = std::move(t);
        init();
    }

private:
    auto init() -> void {
        //do actual work
    }

    BigMemoryHungryType real_t;
};

这似乎很好,但是如果init()抛出异常,它会违反强大的异常保证。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:3)

试试这个

auto init(BigMemoryHungryType t) -> void {
   init(std::move(t));
}

它会将BigMemoryHungryType复制一次到临时,并将其移动到移动过载中的实例字段