如何为Eigenvectors启用复制删除移动成员?

时间:2014-02-01 20:27:42

标签: c++ c++11 move eigen copy-elision

移动支持 Eigen was submitted in this patch in 2011。但是我在Matrix头文件中找不到移动构造函数。此外,Eigen网页仍然具有列为"to do"项的移动语义。所有这些都表明该补丁尚未提交给发布版本

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

#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;
}

输出结果为:

first
3.14
3.14
3.14

first
3.14
3.14
3.14

other
3.14
3.14
3.14

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

修改

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

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

我想知道:

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

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

1 个答案:

答案 0 :(得分:5)

我不确定为什么你认为该功能已经“完成”:虽然提交了一个补丁,但该错误显然仍然是开放的,与您的经验一致,表明该补丁尚未合并到特征源树中

你的测试用例中也有一个错误:你似乎期望first在移动后以某种方式“空”,但它将处于未指定的状态。虽然它确实从快速浏览一下补丁提交中看出人们可能期望实践中的“空”结果,但补丁中没有足够的上下文来真正知道移动对象将处于什么状态。所以,除非你有一些其他的信息来源,你的期望是有点没有根据的。