據我瞭解[class.copy.ctor]和[class.copy.assign],在下面的代碼結構A
不宜動,constructible也動彈不了,分配:不可能的隱式移動操作?
#include <type_traits>
struct X {
X() noexcept; // user-declared default constructor
~X() noexcept; // Force X not to be trivially copyable
X(X &&) = delete; // Explicitly deleted move constructor
X(X const &) = delete; // Explicitly deleted copy constructor
X & operator=(X &&) = delete; // Explicitly deleted move assignment operator
X & operator=(X const &) = delete; // Explicitly deleted copy assignment op.
};
static_assert(!std::is_copy_constructible<X>::value, "");
static_assert(!std::is_copy_assignable<X>::value, "");
static_assert(!std::is_move_assignable<X>::value, "");
static_assert(!std::is_move_constructible<X>::value, "");
static_assert(!std::is_trivially_copyable<X>::value, "");
static_assert(!std::is_trivially_copy_assignable<X>::value, "");
static_assert(!std::is_trivially_copy_constructible<X>::value, "");
static_assert(!std::is_trivially_move_assignable<X>::value, "");
static_assert(!std::is_trivially_move_constructible<X>::value, "");
struct A {
A() noexcept; // user-declared default constructor
A(A const &) noexcept; // user-declared copy constructor
A & operator=(A const &) noexcept; // user-declared copy assignment operator
X x;
};
static_assert(std::is_copy_constructible<A>::value, "");
static_assert(std::is_copy_assignable<A>::value, "");
static_assert(!std::is_move_assignable<A>::value, ""); // FAILS?!
static_assert(!std::is_move_constructible<A>::value, ""); // FAILS?!
static_assert(!std::is_trivially_copyable<A>::value, "");
static_assert(!std::is_trivially_copy_assignable<A>::value, "");
static_assert(!std::is_trivially_copy_constructible<A>::value, "");
static_assert(!std::is_trivially_move_assignable<A>::value, "");
static_assert(!std::is_trivially_move_constructible<A>::value, "");
但是,有兩個靜態斷言失敗,GCC和鐺,這意思是由於某種原因,A
是可移動分配和移動可構建的。
在我的推理這應該不是,因爲struct A
:
- 沒有顯式聲明的舉動構造
- 沒有顯式聲明的舉動賦值運算符
- 有一個用戶聲明的拷貝構造函數
- 有一個用戶聲明的複製分配操作符。
- 有一個
x
類型的X
這是不能直接初始化與任何其他A::x
,因爲所有參與重載決議的X
的構造函數被明確刪除。
這是一個編譯器錯誤或我誤解的東西嗎?
@jotik你沒有從'A'中刪除它們。刪除和不生成是不同的東西:刪除的函數/構造函數參與重載解析,而不是生成的函數不。另外'x'成員默認初始化到處,因爲您沒有在用戶定義的構造函數中以其他方式告訴它。 –