C++ 如果对象是右值,则确保移动成员变量 请考虑以下代码: 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(); }
使用足够新的编译器(阅读:非MSVC 2013),您可以重载右值对左值C++ 如果对象是右值,则确保移动成员变量 请考虑以下代码: 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(); },c++,c++11,c++14,rvalue,C++,C++11,C++14,Rvalue,使用足够新的编译器(阅读:非MSVC 2013),您可以重载右值对左值 class A { // ... std::vector<double> get_data() && noexcept { return std::move(m_data); } std::vector<double> get_data() const & { // not noexcept, could throw return m_data;
class A {
// ...
std::vector<double> get_data() && noexcept {
return std::move(m_data);
}
std::vector<double> get_data() const & { // not noexcept, could throw
return m_data;
}
// ...
};
A类{
// ...
std::vector get_data()&&noexcept{
返回标准::移动(m_数据);
}
std::vector get_data()常量&{//not noexcept,可能引发
返回m_数据;
}
// ...
};
或者,左值版本可以返回对向量的const引用,并且是noexcept,但这意味着您暴露了一个事实,即您在某处有一个物理变量,这阻止了您在将来的重构中更改它
请注意,不能有一个没有ref限定符的函数和另一个具有ref限定符的函数,否则它们的名称和参数都相同。它模棱两可,编译器应该抱怨。@Barry:答案部分在下面,bub:↓↓↓↓↓↓↓ 我知道您知道它在哪里,因为您在其中发布了。您的原始版本的
get\u data
将调用一个复制构造函数,它可能会抛出bad\u alloc
,在这种情况下,noexcept
将调用std::terminate()
。可能您只希望非复制rvalue重载为noexcept
class A {
// ...
std::vector<double> get_data() && noexcept {
return std::move(m_data);
}
std::vector<double> get_data() const & { // not noexcept, could throw
return m_data;
}
// ...
};