bug #725: make move ctor/assignment noexcept.

This commit is contained in:
Gael Guennebaud 2016-06-03 14:28:25 +02:00
parent e8b922ca63
commit 8d97ba6b22
5 changed files with 23 additions and 11 deletions

View File

@ -252,6 +252,11 @@
// for min/max: // for min/max:
#include <algorithm> #include <algorithm>
// for std::is_nothrow_move_assignable
#ifdef EIGEN_INCLUDE_TYPE_TRAITS
#include <type_traits>
#endif
// for outputting debug info // for outputting debug info
#ifdef EIGEN_DEBUG_ASSIGN #ifdef EIGEN_DEBUG_ASSIGN
#include <iostream> #include <iostream>

View File

@ -364,7 +364,7 @@ template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynam
} }
#if EIGEN_HAS_RVALUE_REFERENCES #if EIGEN_HAS_RVALUE_REFERENCES
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage(DenseStorage&& other) DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT
: m_data(std::move(other.m_data)) : m_data(std::move(other.m_data))
, m_rows(std::move(other.m_rows)) , m_rows(std::move(other.m_rows))
, m_cols(std::move(other.m_cols)) , m_cols(std::move(other.m_cols))
@ -374,7 +374,7 @@ template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynam
other.m_cols = 0; other.m_cols = 0;
} }
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage& operator=(DenseStorage&& other) DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
{ {
using std::swap; using std::swap;
swap(m_data, other.m_data); swap(m_data, other.m_data);
@ -443,7 +443,7 @@ template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Ro
} }
#if EIGEN_HAS_RVALUE_REFERENCES #if EIGEN_HAS_RVALUE_REFERENCES
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage(DenseStorage&& other) DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT
: m_data(std::move(other.m_data)) : m_data(std::move(other.m_data))
, m_cols(std::move(other.m_cols)) , m_cols(std::move(other.m_cols))
{ {
@ -451,7 +451,7 @@ template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Ro
other.m_cols = 0; other.m_cols = 0;
} }
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage& operator=(DenseStorage&& other) DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
{ {
using std::swap; using std::swap;
swap(m_data, other.m_data); swap(m_data, other.m_data);
@ -516,7 +516,7 @@ template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dyn
} }
#if EIGEN_HAS_RVALUE_REFERENCES #if EIGEN_HAS_RVALUE_REFERENCES
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage(DenseStorage&& other) DenseStorage(DenseStorage&& other) EIGEN_NOEXCEPT
: m_data(std::move(other.m_data)) : m_data(std::move(other.m_data))
, m_rows(std::move(other.m_rows)) , m_rows(std::move(other.m_rows))
{ {
@ -524,7 +524,7 @@ template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dyn
other.m_rows = 0; other.m_rows = 0;
} }
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage& operator=(DenseStorage&& other) DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
{ {
using std::swap; using std::swap;
swap(m_data, other.m_data); swap(m_data, other.m_data);

View File

@ -270,7 +270,7 @@ class Matrix
#if EIGEN_HAS_RVALUE_REFERENCES #if EIGEN_HAS_RVALUE_REFERENCES
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
Matrix(Matrix&& other) Matrix(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
: Base(std::move(other)) : Base(std::move(other))
{ {
Base::_check_template_params(); Base::_check_template_params();
@ -278,7 +278,7 @@ class Matrix
Base::_set_noalias(other); Base::_set_noalias(other);
} }
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
Matrix& operator=(Matrix&& other) Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
{ {
other.swap(*this); other.swap(*this);
return *this; return *this;

View File

@ -494,13 +494,13 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
#if EIGEN_HAS_RVALUE_REFERENCES #if EIGEN_HAS_RVALUE_REFERENCES
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
PlainObjectBase(PlainObjectBase&& other) PlainObjectBase(PlainObjectBase&& other) EIGEN_NOEXCEPT
: m_storage( std::move(other.m_storage) ) : m_storage( std::move(other.m_storage) )
{ {
} }
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
PlainObjectBase& operator=(PlainObjectBase&& other) PlainObjectBase& operator=(PlainObjectBase&& other) EIGEN_NOEXCEPT
{ {
using std::swap; using std::swap;
swap(m_storage, other.m_storage); swap(m_storage, other.m_storage);

View File

@ -437,7 +437,8 @@
// Does the compiler support C++11 noexcept? // Does the compiler support C++11 noexcept?
#ifndef EIGEN_HAS_CXX11_NOEXCEPT #ifndef EIGEN_HAS_CXX11_NOEXCEPT
#if EIGEN_MAX_CPP_VER>=11 && \ #if EIGEN_MAX_CPP_VER>=11 && \
((__cplusplus > 201103L) \ (__has_feature(cxx_noexcept) \
|| (__cplusplus > 201103L) \
|| ((__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_ICC>=1400)) \ || ((__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_ICC>=1400)) \
|| EIGEN_COMP_MSVC >= 1900) || EIGEN_COMP_MSVC >= 1900)
#define EIGEN_HAS_CXX11_NOEXCEPT 1 #define EIGEN_HAS_CXX11_NOEXCEPT 1
@ -911,10 +912,16 @@ namespace Eigen {
# define EIGEN_CATCH(X) else # define EIGEN_CATCH(X) else
#endif #endif
#if EIGEN_HAS_CXX11_NOEXCEPT #if EIGEN_HAS_CXX11_NOEXCEPT
# define EIGEN_INCLUDE_TYPE_TRAITS
# define EIGEN_NOEXCEPT noexcept
# define EIGEN_NOEXCEPT_IF(x) noexcept(x)
# define EIGEN_NO_THROW noexcept(true) # define EIGEN_NO_THROW noexcept(true)
# define EIGEN_EXCEPTION_SPEC(X) noexcept(false) # define EIGEN_EXCEPTION_SPEC(X) noexcept(false)
#else #else
# define EIGEN_NOEXCEPT
# define EIGEN_NOEXCEPT_IF(x)
# define EIGEN_NO_THROW throw() # define EIGEN_NO_THROW throw()
# define EIGEN_EXCEPTION_SPEC(X) throw(X) # define EIGEN_EXCEPTION_SPEC(X) throw(X)
#endif #endif