Eigen LinSpaced - 弃用复制警告

Eigen LinSpaced - deprecated-copy warning

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

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

警告消息很长且难以阅读,所以我不会post 全部放在这里。触发的警告是-Wdeprecated-copy,警告信息的核心部分(我认为)在follow

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++ 标准的弃用警告。

目前复制构造函数是隐式定义的,即使class有一个user-provided析构函数或user-provided复制赋值运算符。

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

不这样做也是违规的rule of 0/3/5。但该规则只是一般准则,如果程序员知道他们在做什么,则不需要始终适用。它(目前)没有被语言强制执行。


因为这个警告是针对库代码的,而不是你自己的,而且库作者不太可能没有正确实现他们所有的 classes,所以我不会担心它。更有可能的是,他们只是直到现在才考虑弃用。

您可以使用 -Wno-deprecated-copy 全局禁用该特定警告,如果这对您来说没问题,或者您可以使用围绕 Eigen header 的诊断编译指示在本地禁用它包括(不确定它是否会适用于模板实例化),参见例如this question 用于 GCC。

如果您对这些警告感到困扰,我会建议您向 Eigen 提交错误报告,但他们似乎已经意识到了这一点,并且最近在他们的 git master 分支上修复了它,参见 this gitlab issue

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