在我的项目中,编译器抱怨以下(以及许多其他类似的)代码片段:
Eigen::ArrayXf window =
Eigen::ArrayXf::LinSpaced(2*M + 1, 0, M_PI)
.head(2*M)
.sin();
Run Code Online (Sandbox Code Playgroud)
警告信息很长且无法阅读,所以我不会在这里发布所有内容。触发的警告是-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)
Run Code Online (Sandbox Code Playgroud)
此警告是否会导致不正确(意外)的结果?如何更正我的代码以消除此警告?
这是关于 C++ 标准的弃用警告。
目前,即使类具有用户提供的析构函数或用户提供的复制赋值运算符,复制构造函数也是隐式定义的。
该消息是一个警告,表明当前的 C++ 标准(自 C++11 起)不赞成这种行为,并且它将在未来版本中从 C++ 中删除。它表示程序员应该手动实现或默认复制构造函数,以便未来 C++ 版本中的预期更改不会在转换时造成麻烦。
不这样做也是违反0/3/5规则的。但该规则只是一般准则,如果程序员知道他们在做什么,则不需要始终适用。它(当前)没有被语言强制执行。
由于这个警告是针对库代码的,而不是你自己的,而且库作者不太可能没有正确实现他们的所有类,所以我不会担心。更有可能的是,他们直到现在才考虑弃用。
-Wno-deprecated-copy如果这对您没问题,您可以全局禁用该特定警告,或者您可以使用围绕 Eigen 标头包含的诊断编译指示在本地禁用它(不确定它是否适用于模板实例化),例如参见GCC 的这个问题。
如果您对这些警告感到困扰,我会建议与 Eigen 一起打开一个关于它的错误报告,但他们似乎已经意识到这一点,并且最近在他们的 git master 分支上修复了它,请参阅这个 gitlab 问题。
所以我想如果您对警告感到困扰并且不想禁用它们,您应该将 Eigen 升级到 git master 上的当前版本或等待包含修复程序的版本。