【发布时间】:2015-08-21 13:15:09
【问题描述】:
请考虑以下代码:
class A
{
public:
A(/* params */) {
// Fill m_data depending on params
}
std::vector<double> get_data() const noexcept {
return m_data;
}
private:
std::vector<double> m_data;
};
std::vector<double> get_data() {
return A{/* suitable params */}.get_data();
}
我想要的是,m_data 被 移动 到函数 get_data() 的调用者,即不应复制。
我怎么能确定是这种情况?显然,A{/* suitable params */} 是一个右值。因此,它的成员变量m_data 在这种情况下是一个右值。那么,再增加一个成员函数就够了吗
std::vector<double> get_data() && noexcept {
return std::move(m_data);
}
【问题讨论】:
-
@Barry:答案部分在下面,小伙子:↓↓↓↓↓↓↓ 我知道你知道它在哪里,因为你在里面发帖了。
-
您的原始版本的
get_data将调用一个复制构造函数,它可能会抛出bad_alloc,在这种情况下noexcept将调用std::terminate()。也许您只希望非复制右值重载为noexcept