C++ 调用'segment()'后,未分配的'Eigen::VectorXd'对象会发生什么情况?

C++ 调用'segment()'后,未分配的'Eigen::VectorXd'对象会发生什么情况?,c++,eigen,eigen3,C++,Eigen,Eigen3,我有一个类Foo,它存储匹配维度的特征MatrixXd和VectorXd,并提供一个执行矩阵向量乘法的简单函数.mult()。我有一个函数,它调用mult(),获取返回向量的一段,并进行进一步的计算。以下是代码的简化版本: #包括 福班{ 本征::矩阵X; 本征::矢量xd v; 公众: Foo(){ X.调整大小(2,2); v、 调整大小(2); 你所做的是节省(但效率低下) f.mult()通过语句剩余部分存在的值(“直到下一个;”)返回Eigen::VectorXd对象。因此,只要将结果

我有一个类
Foo
,它存储匹配维度的特征
MatrixXd
VectorXd
,并提供一个执行矩阵向量乘法的简单函数
.mult()
。我有一个函数,它调用
mult()
,获取返回向量的一段,并进行进一步的计算。以下是代码的简化版本:

#包括
福班{
本征::矩阵X;
本征::矢量xd v;
公众:
Foo(){
X.调整大小(2,2);
v、 调整大小(2);

你所做的是节省(但效率低下)

f.mult()
通过语句剩余部分存在的值(“直到下一个
”)返回
Eigen::VectorXd
对象。因此,只要将结果存储到
VectorXd
(而不是
auto
对象)中,对其调用
段()
是安全的

然而,为了获得矩阵向量积的一段,将矩阵的相应子块进行多倍运算更为有效,即:

(X*v).segment(a,b) == X.rows(a,b) * v

你认为一个悬空的引用会发生在哪里?这似乎更多的是一个普通的C++而不是一个特征问题。如果你关心的是表达式模板:既然你正在返回/分配给<代码>::VCCTRESXD< /COD>所有表达式都得到了评价。“临时表在下一个半列超出范围”。无论是否为RVO,您的代码都是安全的,因为
val
的赋值出现在半列之前。