Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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++ 如果对象是右值,则确保移动成员变量 请考虑以下代码: 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;

使用足够新的编译器(阅读:非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;
  }
  // ...
};
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;
  }
  // ...
};