c++ - Eigen LinSpaced - 不推荐使用的拷贝警告

标签 c++ c++11 eigen

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

    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/

相关文章:

c++ - 将二进制文件加载到 Eigen 矩阵时删除可能冗余的模板参数

c++ - 为什么从 write() 调用 __kernel_vsyscall() 永远不会返回?

c++ - 在父类中访问子类的功能

c++ - ~i 真的等同于 i != -1 吗?

c++ - 如何加快 std::vector 访问时间

c++ - 使用迭代器和可变参数模板的笛卡尔积

c++ - 如何确定更大类型的 decltype 表达式

c++ - 具有专门参数的类方法

c++ - 在模板函数中使用 Eigen::LLT

c++ - Rcpp 相当于 rowsum