mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-22 01:29:35 +08:00
Bug #1788: Fix rule-of-three violations inside the stable modules.
This fixes deprecated-copy warnings when compiling with GCC>=9 Also protect some additional Base-constructors from getting called by user code code (#1587)
This commit is contained in:
parent
6965f6de7f
commit
870e53c0f2
@ -153,8 +153,8 @@ template<typename Derived> class ArrayBase
|
|||||||
// inline void evalTo(Dest& dst) const { dst = matrix(); }
|
// inline void evalTo(Dest& dst) const { dst = matrix(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(ArrayBase)
|
||||||
ArrayBase() : Base() {}
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(ArrayBase)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ArrayBase(Index);
|
explicit ArrayBase(Index);
|
||||||
|
@ -121,6 +121,8 @@ class CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>
|
|||||||
{
|
{
|
||||||
return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
|
return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
|
||||||
}
|
}
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(CwiseUnaryViewImpl)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
@ -636,11 +636,12 @@ template<typename Derived> class DenseBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
|
||||||
/** Default constructor. Do nothing. */
|
/** Default constructor. Do nothing. */
|
||||||
EIGEN_DEVICE_FUNC DenseBase()
|
EIGEN_DEVICE_FUNC DenseBase()
|
||||||
{
|
{
|
||||||
/* Just checks for self-consistency of the flags.
|
/* Just checks for self-consistency of the flags.
|
||||||
* Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
|
* Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
|
||||||
*/
|
*/
|
||||||
#ifdef EIGEN_INTERNAL_DEBUGGING
|
#ifdef EIGEN_INTERNAL_DEBUGGING
|
||||||
EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
|
EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
|
||||||
|
@ -182,6 +182,8 @@ template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
@ -294,6 +296,9 @@ template<typename Derived> class MapBase<Derived, WriteAccessors>
|
|||||||
// In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
|
// In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
|
||||||
// see bugs 821 and 920.
|
// see bugs 821 and 920.
|
||||||
using ReadOnlyMapBase::Base::operator=;
|
using ReadOnlyMapBase::Base::operator=;
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
|
#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
|
||||||
|
@ -481,7 +481,8 @@ template<typename Derived> class MatrixBase
|
|||||||
EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p)
|
EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p)
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
EIGEN_DEVICE_FUNC MatrixBase() : Base() {}
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(MatrixBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MatrixBase)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EIGEN_DEVICE_FUNC explicit MatrixBase(int);
|
EIGEN_DEVICE_FUNC explicit MatrixBase(int);
|
||||||
|
@ -153,6 +153,8 @@ template<typename MatrixType> class TransposeImpl<MatrixType,Dense>
|
|||||||
{
|
{
|
||||||
return derived().nestedExpression().coeffRef(index);
|
return derived().nestedExpression().coeffRef(index);
|
||||||
}
|
}
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TransposeImpl)
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \returns an expression of the transpose of *this.
|
/** \returns an expression of the transpose of *this.
|
||||||
|
@ -219,9 +219,7 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularView
|
|||||||
explicit inline TriangularView(MatrixType& matrix) : m_matrix(matrix)
|
explicit inline TriangularView(MatrixType& matrix) : m_matrix(matrix)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
using Base::operator=;
|
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(TriangularView)
|
||||||
TriangularView& operator=(const TriangularView &other)
|
|
||||||
{ return Base::operator=(other); }
|
|
||||||
|
|
||||||
/** \copydoc EigenBase::rows() */
|
/** \copydoc EigenBase::rows() */
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
@ -557,6 +555,10 @@ template<typename _MatrixType, unsigned int _Mode> class TriangularViewImpl<_Mat
|
|||||||
template<typename ProductType>
|
template<typename ProductType>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE TriangularViewType& _assignProduct(const ProductType& prod, const Scalar& alpha, bool beta);
|
EIGEN_STRONG_INLINE TriangularViewType& _assignProduct(const ProductType& prod, const Scalar& alpha, bool beta);
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(TriangularViewImpl)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(TriangularViewImpl)
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -1045,11 +1045,48 @@ namespace Eigen {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \internal
|
||||||
|
* \brief Macro to explicitly define the default copy constructor.
|
||||||
|
* This is necessary, because the implicit definition is deprecated if the copy-assignment is overridden.
|
||||||
|
*/
|
||||||
|
#if EIGEN_HAS_CXX11
|
||||||
|
#define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS) EIGEN_DEVICE_FUNC CLASS(const CLASS&) = default;
|
||||||
|
#else
|
||||||
|
#define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** \internal
|
/** \internal
|
||||||
* \brief Macro to manually inherit assignment operators.
|
* \brief Macro to manually inherit assignment operators.
|
||||||
* This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.
|
* This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.
|
||||||
|
* With C++11 or later this also default-implements the copy-constructor
|
||||||
*/
|
*/
|
||||||
#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
|
#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
|
||||||
|
EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
|
||||||
|
|
||||||
|
/** \internal
|
||||||
|
* \brief Macro to manually define default constructors and destructors.
|
||||||
|
* This is necessary when the copy constructor is re-defined.
|
||||||
|
* For empty helper classes this should usually be protected, to avoid accidentally creating empty objects.
|
||||||
|
*
|
||||||
|
* Hiding the default destructor lead to problems in C++03 mode together with boost::multiprecision
|
||||||
|
*/
|
||||||
|
#if EIGEN_HAS_CXX11
|
||||||
|
#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived) \
|
||||||
|
EIGEN_DEVICE_FUNC Derived() = default; \
|
||||||
|
EIGEN_DEVICE_FUNC ~Derived() = default;
|
||||||
|
#else
|
||||||
|
#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived) \
|
||||||
|
EIGEN_DEVICE_FUNC Derived() {}; \
|
||||||
|
/* EIGEN_DEVICE_FUNC ~Derived() {}; */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Just a side note. Commenting within defines works only by documenting
|
* Just a side note. Commenting within defines works only by documenting
|
||||||
|
@ -110,6 +110,9 @@ class no_assignment_operator
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
no_assignment_operator& operator=(const no_assignment_operator&);
|
no_assignment_operator& operator=(const no_assignment_operator&);
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(no_assignment_operator)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(no_assignment_operator)
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \internal return the index type with the largest number of bits */
|
/** \internal return the index type with the largest number of bits */
|
||||||
|
@ -198,6 +198,9 @@ class QuaternionBase : public RotationBase<Derived, 3>
|
|||||||
#ifdef EIGEN_QUATERNIONBASE_PLUGIN
|
#ifdef EIGEN_QUATERNIONBASE_PLUGIN
|
||||||
# include EIGEN_QUATERNIONBASE_PLUGIN
|
# include EIGEN_QUATERNIONBASE_PLUGIN
|
||||||
#endif
|
#endif
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
|
||||||
};
|
};
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -304,12 +307,6 @@ public:
|
|||||||
m_coeffs = std::move(other.coeffs());
|
m_coeffs = std::move(other.coeffs());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// And now because we declared a constructor, we don't get an implicit copy constructor. Say we want one.
|
|
||||||
/** Default copy constructor */
|
|
||||||
EIGEN_DEVICE_FUNC Quaternion(const Quaternion& other)
|
|
||||||
: m_coeffs(other.coeffs())
|
|
||||||
{}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC static Quaternion UnitRandom();
|
EIGEN_DEVICE_FUNC static Quaternion UnitRandom();
|
||||||
|
@ -138,12 +138,6 @@ public:
|
|||||||
/** \returns the inverse translation (opposite) */
|
/** \returns the inverse translation (opposite) */
|
||||||
Translation inverse() const { return Translation(-m_coeffs); }
|
Translation inverse() const { return Translation(-m_coeffs); }
|
||||||
|
|
||||||
Translation& operator=(const Translation& other)
|
|
||||||
{
|
|
||||||
m_coeffs = other.m_coeffs;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const Translation Identity() { return Translation(VectorType::Zero()); }
|
static const Translation Identity() { return Translation(VectorType::Zero()); }
|
||||||
|
|
||||||
/** \returns \c *this with scalar type casted to \a NewScalarType
|
/** \returns \c *this with scalar type casted to \a NewScalarType
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
#pragma GCC diagnostic ignored "-Wdeprecated"
|
#pragma GCC diagnostic ignored "-Wdeprecated"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >=9)
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-copy"
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <valarray>
|
#include <valarray>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user