C++ Auto使用用​​户声明的析构函数生成移动构造函数?

Chr*_*son 6 c++ destructor move-constructor c++14

根据cppreference这个答案,C++应该自动,如果有一个用户声明析构函数生成一个移动构造函数.但是,在实践中用Clang检查这个,我看到了一个自动生成的移动构造函数.以下代码打印"is_move_constructible:1":

#include <iostream>
#include <type_traits>

struct TestClass
{
  ~TestClass()
  {}
};

int main( int argc, char** argv )
{
  std::cout << "is_move_constructible: " << std::is_move_constructible<TestClass>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我误解"没有用户声明的析构函数"或std :: is_move_constructible吗?我正在使用'-std = c ++ 14'和Apple LLVM版本7.0.2(clang-700.1.81)进行编译.

Alp*_*per 8

没有移动构造函数但具有接受const T&参数,满足std::is_move_constructible和隐式声明的复制构造函数的复制构造函数的类型具有该形式T::T(const T&).

如果隐式声明的复制构造函数被删除,std::is_move_constructible则不满足如下.

#include <iostream>
#include <type_traits>

struct TestClass
{
  ~TestClass() {}
  TestClass(const TestClass&) = delete;
};

int main( int argc, char** argv )
{
  std::cout << "is_move_constructible: " << std::is_move_constructible<TestClass>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)