Как включить копирование-перемещение членов для собственных векторов?

переехать Поддержка для собственный был представлен в этом патче в 2011 году. Однако я не могу найти конструктор перемещения в заголовочном файле 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;
}

Выход:

first
3.14
3.14
3.14

first
3.14
3.14
3.14

other
3.14
3.14
3.14

Как я могу включить функцию удаления копии из вышеупомянутого патча в Собственный 3.2.0.?

РЕДАКТИРОВАТЬ:

Кажется, что в семантике ходов классов Eigen нет ничего плохого. Однако есть только дефолт переместить конструкторы и переместить операторы присваивания.

Патч, обеспечивающий явный конструкторы перемещения и операторы перемещения, которые позволяют избежать копирования всех данных, еще не были объединены в версию выпуска.

Я бы хотел знать:

  1. Как применить этот патч к Eigen 3.2.0? Есть ли инструмент или я должен просто изменить файлы вручную.

  2. У кого-нибудь есть опыт использования этого патча?

1

Решение

Я не уверен, почему вы думаете, что эта функция «закончена»: хотя патч был отправлен, эта ошибка, безусловно, все еще открыта, что, как показывает ваш опыт, предполагает, что патч не был объединен с исходным деревом Eigen.

У вас также есть ошибка в вашем тестовом примере: вы, кажется, ожидаете first быть каким-то образом «пустым» после перемещения, но вместо этого оно будет в неопределенном состоянии. Хотя из первого взгляда на отправку патча видно, что на практике можно ожидать «пустого» результата, в патче недостаточно контекста, чтобы действительно знать, в каком состоянии будет перемещенный объект. Итак, если вы у вас есть другой источник информации, ваши ожидания несколько необоснованны.

5

Другие решения

Других решений пока нет …