【问题标题】:Eigen and c++11 assignment and rreferenceEigen 和 c++11 赋值和引用
【发布时间】:2015-12-31 15:15:01
【问题描述】:

我对 c++11 移动语义感到非常困惑,尤其是特征 - 它是否有右值的赋值运算符 (operator=(Type&&))?

此代码因大小不匹配而崩溃:

    Eigen::VectorXd&& func(){
        Eigen::VectorXd&& v=Eigen::VectorXd::Zero(5);
        return std::move(v);
    }

    Eigen::VectorXd v=Eigen::VectorXd::Zero(10);
    v.block(0,0,5,1)=func();

唯一的工作方式是如果 func 被定义为:

    Eigen::VectorXd func(){
        Eigen::VectorXd v=Eigen::VectorXd::Zero(5);
        return v;
    }

即使是常规的单一引用 (&) 也不起作用。我什么时候可以使用这些参考资料?内存怎么了? 谢谢!

【问题讨论】:

  • 完全正确,应该按值返回。除非您想返回对无论引用如何都存在的对象的引用,否则按值返回。引用是指对象。如果您无法显示该对象,则您的参考资料无法引用。我是否已经提到您应该按价值返回?
  • 不返回对具有自动存储持续时间的对象(“局部变量”)的引用。右值引用不会改变这一点,这一直是被禁止的。
  • 好的,我知道通过常规引用返回是一个坏主意,因为该对象不存在于函数之外。感谢那。粗略地说,它会按价值工作-没有理由不应该这样做,但是所有这些复制!
  • @user2070148 不,就是这样。返回的对象是一个右值(标准要求return 语句首先尝试移动),因此按值返回通常会触发移动,而不是副本。
  • std::move 东西使对象移动并存在于函数之外,但可能没有与 Rvalue-reference 一起使用的赋值运算符。虽然我认为有一个复制构造函数。我尝试了第一个 func(使用 &&),而不是将其分配给现有块,而是将其分配给 Eigen::VectorXd v1 = func();- 它有效

标签: c++ c++11 eigen move-semantics rvalue-reference


【解决方案1】:

您正在返回对局部变量的引用。不管是右值引用,函数返回时局部变量都会被破坏。

您的按值返回的版本是最好的,因为它将自动利用移动构造函数(假设 Eigen 实现了移动构造函数)。

【讨论】:

  • std::move 应该保留这个右值的内存。但无论如何它都不能分配给现有的特征矩阵,因为据我检查它不支持 operator=(Eigen::VectorXd&&)..
  • @user2070148 这是不正确的,std::move() 实际上并没有移动任何东西。您可以将其视为标记变量以让其他人知道可以根据需要移动/交换/修改它。但是在您的原始示例中,没有任何东西可以移动它,因此它只会被破坏,并且您会留下一个悬空的引用。
  • 感谢您的回答。这正是我不明白的事情——我什么时候可以让它真正移动变量?如果我将 func() 的第一个版本用作: Eigen::VectorXd v1=func();该程序没有崩溃..所以这一举动奏效了?因为如果它是一个悬空引用,程序不应该崩溃吗?
  • 我再次检查,它崩溃了。。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2015-09-18
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多