如何解决带有 Eigen::Ref 的临时对象是否在复制时被丢弃并且是否支持移动语义?
如果 Eigen::Ref<T>
是 const 限定的,则 T
类可以创建临时对象。该类实现为 MapBase
的派生类,并且 const 版本具有引用类型的成员。因此,据我所知,临时文件存储在 Ref
对象中,而 MapBase
在持有临时文件时指向该成员的数据。
现在的问题是,这个临时对象的生命周期是多少?从代码 here 和一些实验来看,它似乎只是 Ref
的生命周期。但令人惊讶的是,临时似乎在复制时被丢弃,并且似乎没有任何方法可以有效地使用移动语义。
对我来说,这将是令人惊讶的行为,甚至找到问题的根源也很痛苦,因为界面没有给您任何关于临时存在的线索。此外,他们被记录在案,但没有提及他们的行为。
另外,如果我真的无法在不使临时文件无效的情况下复制或移动它们并且无法控制是否创建临时文件,那么就没有办法将它们用作成员或安全地将它们放入 {{1 }} 例如,对吗?
更新: 以下代码导致无效读取(由 valgrind 报告)。非精简版本导致我的程序崩溃。
std::vector
似乎仅仅复制不是问题,但创建一个临时并复制它是问题,因为以下工作正常:
struct S {
Ref<const VectorXf> ref;
explicit S( Ref<const VectorXf> const& r )
: ref( r ) {}
};
int main() {
const MatrixXf mat = MatrixXf::Constant( 4,4,1.25f );
S s{ mat.row( 0 ) };
return s.ref(0); // invalid read
}
更新2: 我认为以下代码显示了正在发生的事情
int main() {
const MatrixXf mat = MatrixXf::Constant( 4,1.25f );
Ref<const VectorXf> ref{mat.row(0)};
S s{ ref };
return s.ref(0); // fine
}
问题是从另一个创建一个 Ref<const VectorXf> make(MatrixXf const & mat) {
Ref<const VectorXf> ref (mat.row(0));
Ref<const VectorXf> ref2(ref);
return ref2;
}
int main() {
const MatrixXf mat = MatrixXf::Constant( 4,1.25f );
return make(mat)(0); // invalid read
}
意味着新创建的一个引用原始临时文件中的临时文件,所以它的有效性现在取决于第一个 Ref
的生命周期。由于 Ref
类不可复制赋值,因此局部变量不容易发生这种情况。
从另一个创建一个 Ref
的可能性误导了我期待实际上并不存在的语义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。