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 升级到当前版本或等待包含修复程序的版本。
在我的项目中,编译器抱怨以下(以及许多其他类似的)代码片段:
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 升级到当前版本或等待包含修复程序的版本。