C++ 是否在复制时丢弃带有Eigen::Ref的临时表,是否支持移动语义?

C++ 是否在复制时丢弃带有Eigen::Ref的临时表,是否支持移动语义?,c++,eigen,C++,Eigen,如果T是const限定的,则Eigen::Ref类可以创建临时变量。该类作为MapBase的派生类实现,const版本具有引用类型的成员。因此,据我所知,临时变量存储在Ref对象中,MapBase在持有临时变量时指向该成员的数据 现在的问题是,这个临时的生命周期是什么?从代码和一些实验来看,这似乎只是Ref的生命周期。但令人惊讶的是,这个临时文件似乎在复制时被丢弃了,而且似乎没有任何方法可以有效地使用移动语义 对我来说,这将是一个令人惊讶的行为,甚至要找到问题的根源都是一件痛苦的事情,因为界面没

如果
T
是const限定的,则
Eigen::Ref
类可以创建临时变量。该类作为
MapBase
的派生类实现,const版本具有引用类型的成员。因此,据我所知,临时变量存储在
Ref
对象中,
MapBase
在持有临时变量时指向该成员的数据

现在的问题是,这个临时的生命周期是什么?从代码和一些实验来看,这似乎只是
Ref
的生命周期。但令人惊讶的是,这个临时文件似乎在复制时被丢弃了,而且似乎没有任何方法可以有效地使用移动语义

对我来说,这将是一个令人惊讶的行为,甚至要找到问题的根源都是一件痛苦的事情,因为界面没有给你任何关于临时存在的线索。此外,他们被记录在案,但对他们的行为却只字不提

此外,如果我真的无法复制或移动它们而不使临时文件无效,并且无法控制是否创建了临时文件,那么就无法将它们用作成员或安全地将它们放入例如
std::vector
中,对吗

更新: 以下代码导致无效读取(valgrind报告)。非精简版本导致我的程序崩溃

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
}
结构{
参考文献;
显式S(参考常数和r)
:ref(r){}
};
int main(){
常数MatrixXf mat=MatrixXf::常数(4,4,1.25f);
S{mat.row(0)};
返回s.ref(0);//读取无效
}
看起来,仅仅复制并不是问题,但创建一个临时文件并复制它是问题,因为以下方法很好:

int main() {
    const MatrixXf mat = MatrixXf::Constant( 4, 4, 1.25f );
    Ref<const VectorXf> ref{mat.row(0)};
    S s{ ref };
    return s.ref(0); // fine
}
intmain(){
常数MatrixXf mat=MatrixXf::常数(4,4,1.25f);
参考{材料行(0)};
S{ref};
返回s.ref(0);//很好
}
更新2: 我认为下面的代码显示了发生了什么

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, 4, 1.25f );
    return make(mat)(0); // invalid read
}
Ref make(矩阵常数和矩阵){
参考(材料行(0));
参考文献2(参考文献);
返回参考文献2;
}
int main(){
常数MatrixXf mat=MatrixXf::常数(4,4,1.25f);
返回make(mat)(0);//读取无效
}
问题是,从另一个
Ref
创建一个,意味着新创建的引用了原始
Ref
中的临时,因此其有效性现在取决于第一个
Ref
的生存期。由于
Ref
类是不可复制赋值的,因此使用局部变量时不容易发生这种情况


从另一个
Ref
创建一个
Ref
的可能性误导了我,使我产生了实际不存在的语义。

Eigen::Ref
只为
常量t
创建临时性。不应在复制时丢弃临时文件。你能在哪里贴一张照片吗?另外,您不能在
std::vector
中使用
Ref
,因为它是不可复制分配的(事实上,
operator=
在非常量情况下重载以覆盖引用的矩阵。对,它们是可复制构造的,但不是可复制分配的。复制构造有点棘手,也是导致我的问题的原因。你可以将引用放入向量中,如中所示,它可以编译。但这是一个非常糟糕的主意,因为我认为它基本上是Caly从来都不能正常工作。让副本像现在这样工作似乎很糟糕。我认为它们要么完全不动,要么最好是只移动。我还想要一个类型,它实际上只是一个引用,不能携带临时变量,但仍然可以指向常量。
Ref const&
有点像
X const&
与任何其他类
X
。这将导致与示例相同的问题:
结构S{const int&ref;explicit S(const int&r):ref(r){};
(如果使用临时整数初始化它)。当然欢迎您提出任何改进文档的建议!创建
std::vector
确实非常危险(而且可能很难预防——而且非常小心可能会有一个有效的用例)。。。