автоматическая ссылка на собственный блок не работает должным образом - PullRequest
0 голосов
/ 17 марта 2019

Я хочу использовать автоматическую ссылку на блок собственной матрицы:

#include <Eigen/Dense>
using namespace Eigen;
void foo(MatrixXf& a)
{
    auto& a_block = a.block(2, 3, 4, 5);
    a_block = MatrixXf::Random(4,5);
}    

Это не компилируется с GCC, поскольку a.block(2, 3, 4, 5) оценивается как временное, тогда как a.block(2, 3, 4, 5) = MatrixXf::Random(4,5); работает отлично.

С моей точки зрения, это не ожидаемое поведение.Есть ли элегантное решение этой проблемы?Должно ли это считаться запросом ошибки / функции для Eigen?

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

с использованием auto вместо auto& решает проблему!

Вопрос был помеченкак дубликат Ссылка временная в msvc , но она не имеет ничего общего с MSVC.Я также дал понять, что очевидно, что a.block(2, 3, 4, 5) оценивается как временный.Вопрос был о том, правильно ли это поведение Эйгена.

1 Ответ

3 голосов
/ 17 марта 2019

block на самом деле не возвращает ссылку, но вместо этого создает объект, похожий на ссылку, типа Block.Недавно созданное значение rvalue любого типа не может быть назначено для ссылки, отличной от const lvalue, так что это все ожидаемое поведение.

Назначение значения Block хорошо, потому что у него перегружено operator= (которое, к сожалению, не имеет собственной записи на странице документации, потому что похоже, что они генерируют определение =, используямакро).Затем эта функция = отправляет все ваши данные в соответствующие части Matrix, из которых был создан Block.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...