在我的项目中,编译器提示以下(以及许多其他类似的)代码片段:
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 起)弃用此行为,并且它将在 future 版本中从 C++ 中删除。它表示程序员应该手动实现或默认复制构造函数,以便将来 C++ 版本中的预期更改不会在转换时造成麻烦。
这也违反了rule of 0/3/5不要这样做。但该规则只是一般准则,如果程序员知道他们在做什么,则不需要总是适用。它(当前)不是由语言强制执行的。
由于此警告是针对库代码的,而不是您自己的,而且库作者不太可能无法正确实现所有类,因此我不会担心。他们更有可能直到现在才考虑弃用。
您可以使用 -Wno-deprecated-copy
全局禁用该特定警告。如果这对您来说没问题,或者您可以使用围绕 Eigen header 包含的诊断编译指示在本地禁用它(不确定它是否适用于模板实例化),请参见例如this question对于海湾合作委员会。
如果您对这些警告感到困扰,我会建议向 Eigen 打开一个关于它的错误报告,但他们似乎已经意识到这一点,并且最近在他们的 git master 分支上修复了它,请参阅 this gitlab issue .
所以我想如果你对警告感到困扰并且不想禁用它们,你应该将 Eigen 升级到 git master 上的当前版本或等待包含修复的版本。
关于c++ - Eigen LinSpaced - 不推荐使用的拷贝警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59573043/