如果标题有点模糊,我们很抱歉;我将尝试通过一些例子澄清它。假设我有一个类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()抛出异常,它会违反强大的异常保证。我错过了一些明显的东西吗?
答案 0 :(得分:3)
试试这个
auto init(BigMemoryHungryType t) -> void {
init(std::move(t));
}
它会将BigMemoryHungryType
复制一次到临时,并将其移动到移动过载中的实例字段