C++ 在访问Eigen::VectorXd时使用零作为第二个索引安全吗?

C++ 在访问Eigen::VectorXd时使用零作为第二个索引安全吗?,c++,eigen,C++,Eigen,Eigen::VectorXd有一个标量运算符()(索引i),它返回向量中索引i处的系数。然而,由于本征::向量xd是本征::矩阵的一种特殊类型,即本征::矩阵的类型,还有一个标量运算符()(索引i,索引j) 问题: 如果我将j设置为零,是否可以假设使用第二个版本是安全的(即没有未定义的行为)?换句话说,下面的代码是否正确 Eigen::VectorXd v(4); v << 1, 2, 3, 4; std::cout << v(2, 0); // displays 3

Eigen::VectorXd
有一个
标量运算符()(索引i)
,它返回向量中索引
i
处的系数。然而,由于
本征::向量xd
本征::矩阵的一种特殊类型,即
本征::矩阵的类型
,还有一个
标量运算符()(索引i,索引j)

问题:

如果我将
j
设置为零,是否可以假设使用第二个版本是安全的(即没有未定义的行为)?换句话说,下面的代码是否正确

Eigen::VectorXd v(4);
v << 1, 2, 3, 4;
std::cout << v(2, 0); // displays 3
Eigen::VectorXd v(4);

v只要
v
是一个列向量,它是安全的,而使用
v(i)
对列向量和行向量都有效,例如:

template<typename T>
void foo(const T &v) {
  v(2);   // OK
  v(2,0); // -> out of bounds runtime assertion
}
MatrixXd mat(10,10);
foo(mat.row(5));
模板
void foo(施工T&v){
v(2);//好的
v(2,0);//->越界运行时断言
}
MatrixXd mat(10,10);
foo(垫排(5));;
我将阐述@ggaels。如果查看DenseCoeffsBase.h(我引用的是3.2.10)中的
操作符()
定义,您将看到它们都调用
coeff
(或
coefref


因此,对于行向量,您必须编写
v(0,2)
,以避免可能的断言失败/越界错误。

为什么不尝试一下呢?正如我所说,我尝试过,但如果有一些奇怪的UB尝试,则无法确保代码是正确的。抱歉,我误解了。根据你的措辞,它听起来像是你编译的,但没有运行它。@mascoj不用担心。谢谢你的代码片段,它确实让人放心。
EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const
{
  eigen_assert(row >= 0 && row < rows()
      && col >= 0 && col < cols());
  return derived().coeff(row, col);
}

EIGEN_STRONG_INLINE CoeffReturnType
operator()(Index index) const
{
  eigen_assert(index >= 0 && index < size());
  return derived().coeff(index);
}
EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId)
{
  if(Flags & RowMajorBit)
    return m_storage.data()[colId + rowId * m_storage.cols()];
  else // column-major
    return m_storage.data()[rowId + colId * m_storage.rows()];
}

EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
{
  return m_storage.data()[index];
}