为可移动类型输入特征?

Kra*_*nar 14 c++ type-traits c++11

我正在尝试编写一个模板,如果T有一个移动构造函数,则表现为单向,如果T没有,则表示另一种方式.我试图寻找一种可以识别这种情况的类型特征,但没有这样的运气,我为此编写自己的类型特征的尝试都失败了.

任何帮助赞赏.

Luc*_*ton 18

我觉得有必要指出一个微妙的区别.

虽然<type_traits>确实提供了std::is_move_constructiblestd::is_move_assignable那些不完全检测类型是否具有移动构造函数(相应地,移动赋值运算符)或没有.例如,std::is_move_constructible<int>::valuetrue,并考虑以下情况:

struct copy_only {
    copy_only(copy_only const&) {} // note: not defaulted on first declaration
};
static_assert( std::is_move_constructible<copy_only>::value
             , "This won't trip" );
Run Code Online (Sandbox Code Playgroud)

请注意,用户声明的复制构造函数会抑制移动构造函数的隐式声明:甚至没有隐藏的,编译器生成的copy_only(copy_only&&).

类型特征的目的是促进泛型编程,因此根据表达式(缺少概念)来指定.std::is_move_constructible<T>::value问的问题是:例如T t = T{};有效吗?它不是要求(假设T这里是一个类类型)是否有一个T(T&&)(或任何其他有效形式)移动构造函数声明.

我不知道你要做什么,我没有理由不相信这std::is_move_constructible不适合你的目的.

  • 在评论心情时 - "is_move_assignable"告诉我们`t = std :: move(u)`是否有效,而不是移动或复制值.对于一个空的`copy_only`对象,无论如何都没有太大的区别. (3认同)

Nic*_*las 9

它被称为std::is_move_constructable.还有std::is_move_assignable.它们都在C++ 0x <type_traits>标头中.