我有一个std::vector
某个类的对象A
。该类非常重要并且具有复制构造函数and移动定义的构造函数。
std::vector<A> myvec;
如果我用以下内容填充向量A
对象(例如使用myvec.push_back(a)
),使用复制构造函数,向量的大小将会增长A( const A&)
实例化向量中元素的新副本。
我可以以某种方式强制执行类的移动构造函数吗A
正在被使用?
你需要通知C++(具体来说std::vector
)你的移动构造函数和析构函数不会抛出,使用noexcept
。然后当向量增长时将调用移动构造函数。
这是如何声明和实现受尊重的移动构造函数std::vector
:
A(A && rhs) noexcept {
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ; // etc...
}
如果构造函数不是noexcept
, std::vector
不能使用它,因为这样它就不能确保标准所要求的异常保证。
有关标准中所述内容的更多信息,请阅读C++ 移动语义和异常
感谢 Bo 暗示这可能与例外有关。另请考虑 Kerrek SB 的建议和使用emplace_back
如果可能。它can更快(但通常不是),它可以更清晰、更紧凑,但也存在一些陷阱(特别是对于非显式构造函数)。
Edit,通常默认就是您想要的:移动所有可以移动的内容,复制其余的。要明确要求,请写
A(A && rhs) = default;
这样做,如果可能的话,您将得到 no except :默认的 Move 构造函数是否定义为 noexcept?
请注意,Visual Studio 2015 及更早版本的早期版本不支持这一点,尽管它支持移动语义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)