如何为特征向量启用复制删除移动成员?

Mar*_*dik 1 c++ move eigen copy-elision c++11

2011年,该补丁中提交了Eigen移动支持.但是我在Matrix头文件中找不到移动构造函数.此外,Eigen网页仍然将移动语义列为"待办事项".所有这些表明补丁尚未提交到发布版本

此测试程序证明移动构造函数保持移动的对象不变.

#include <iostream>
#include <utility>

#include <eigen3/Eigen/Dense>

int main()
{
    Eigen::VectorXd first = Eigen::VectorXd::Constant(3, 3.14);
    std::cout << "first\n" << first << std::endl << std::endl;
    Eigen::VectorXd other = std::move(first);
    std::cout << "first\n" << first << std::endl << std::endl;
    std::cout << "other\n" << other << std::endl << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

first
3.14
3.14
3.14

first
3.14
3.14
3.14

other
3.14
3.14
3.14
Run Code Online (Sandbox Code Playgroud)

如何从Eigen 3.2.0中的上述补丁中启用复制删除移动功能.

编辑:

似乎特征类的移动语义没有任何问题.但是,只有默认的移动构造函数和移动赋值运算符.

提供显式移动构造函数和移动赋值运算符的补丁尚未合并到发布版本中,从而避免复制整个数据.

我想知道:

  1. 如何将此补丁应用于Eigen 3.2.0?是否有工具或我应该手动修改文件.

  2. 有没有人有使用这个补丁的经验?

Lig*_*ica 5

我不知道为什么你认为该功能"已完成":虽然补丁被提交,这个bug显然还是开放的,它与你的经验一起,表明该补丁还没有被合并到本征源代码树.

您的测试用例中也有一个错误:first在移动后,您似乎期望以某种方式"空",但它将处于未指定的状态.尽管它从一个可能期望"空"的结果在实践中的补丁提交一瞥的出现,没有补丁中有足够的背景下真正了解什么状态转移,从对象将在,所以,除非你有一些其他的信息来源,你的期望是有点没有根据的.