Eigen LinSpaced-已淘汰副本警告

问题描述 投票:0回答:1

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

    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++ eigen eigenvalue
1个回答
1
投票

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

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

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

这也违反了rule of 0/3/5。但是,该规则只是一般准则,如果程序员知道他们在做什么,并不一定要始终适用。


因为此警告是针对库代码的,并且作者不太可能无法正确实现所有类,所以我对此不会感到担心。

如果可以,您可以使用-Wno-deprecated-copy全局禁用该特定警告,或者您可以使用Eigen标头include(不确定它是否适用于模板实例化)周围的诊断实用程序在本地禁用该警告。this questionfor GCC。

如果您对警告感到不安,我建议与Eigen一起就此问题打开一个错误报告,但他们似乎已经意识到它,并且在修复过程中,请参阅this gitlab issue

因此,我想如果您对警告感到不安,并且不想禁用它们,则应该密切注意该问题,并在它们完全解决之后更新到最新版本。

© www.soinside.com 2019 - 2024. All rights reserved.