Eigen LinSpaced - 已弃用的副本警告



在我的项目中,编译器抱怨以下(以及许多其他类似的(代码片段:

Eigen::ArrayXf window =
Eigen::ArrayXf::LinSpaced(2*M + 1, 0, M_PI)
.head(2*M)
.sin();

警告消息很长且不可读,因此我不会在此处发布所有警告消息。触发的警告是-Wdeprecated-copy,警告消息的核心部分(在我看来(在以下

warning: implicitly-declared ‘Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>::Block(const Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>&)’ is deprecated [-Wdeprecated-copy]
note: because ‘Eigen::Block<const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >, -1, 1, false>’ has user-provided ‘Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>& Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>::operator=(const Eigen::BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Eigen::Dense>&) [with XprType = const Eigen::CwiseNullaryOp<Eigen::internal::linspaced_op<float, __vector(4) float>, Eigen::Array<float, -1, 1> >; int BlockRows = -1; int BlockCols = 1; bool InnerPanel = false]’
830 |     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) 
|                                                    ^~~~~~~~
/somewhere/Eigen/src/Core/util/Macros.h:842:53: note: in expansion of macro ‘EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR’
842 | #define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
|                                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/somewhere/Eigen/src/Core/Block.h:161:5: note: in expansion of macro ‘EIGEN_INHERIT_ASSIGNMENT_OPERATORS’
161 |     EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)

此警告是否会导致不正确(意外(的结果?如何更正代码以消除此警告?

这是关于C++标准的弃用警告。

目前,即使类具有用户提供的析构函数或用户提供的复制赋值运算符,复制构造函数也是隐式定义的。

该消息是一个警告,指出当前 C++ 标准(自 C++11 起(已弃用此行为,并且将在将来的版本中从C++中删除此行为。它指示程序员应手动实现或默认复制构造函数,以便将来C++版本中的预期更改在转换时不会造成麻烦。

不这样做也违反了 0/3/5 的规则。但该规则只是一个一般准则,如果程序员知道他们在做什么,则不需要总是适用。它(目前(不是由语言强制执行的。


由于此警告是针对库代码的,而不是您自己的代码,并且库作者不太可能未能正确实现其所有类,因此我不会对此表示关注。更有可能的是,他们直到现在才考虑到弃用。

您可以使用-Wno-deprecated-copy全局禁用该特定警告,或者您可以使用围绕 Eigen 标头包含的诊断杂注在本地禁用它(不确定它是否适用于模板实例化(,例如,请参阅 GCC 的这个问题。

如果您对警告感到困扰,我本建议您与 Eigen 一起打开一个错误报告,但他们似乎已经意识到这一点,并且最近在他们的 git master 分支上修复了它,请参阅此 gitlab 问题。

所以我想如果您对警告感到困扰并且不想禁用它们,您应该将 Eigen 升级到 git master 上的当前版本或等待包含该修复程序的版本。

最新更新