我想检测(并使用std::enable_if
中的结果)C++类是否定义了移动构造函数。如何检测一个类是否有移动构造函数?
下面的程序打印MOVE
,所以使用std::is_move_constructible
是不是做的方式:
#include <stdio.h>
#include <type_traits>
class C {
public:
C() { puts("C()"); }
C(int) { puts("C(int)"); }
~C() { puts("~C()"); }
C(const C&) { puts("C(const C&)"); }
// C(C&&) { puts("C(C&&)"); }
C& operator=(const C&) { puts("C="); return *this; }
};
int main(int argc, char** argv) {
(void)argc; (void)argv;
if (std::is_move_constructible<C>::value) puts("MOVE");
return 0;
}
我需要一个程序,打印MOVE
只有当我去掉含有&&
行。
你想“has_user_defined_move_ctor”基本上? – Borgleader
由于右值可以绑定到常量引用,除非实际删除右值构造函数,即C(C &&)= delete;',否则该类的用户不会看到区别。你知道是否有移动构造函数可以解决真正的问题吗? –
是的,我想要has_user_defined_move_ctor。真正的问题是有效地追加到一个std :: vector:如果类有一个移动构造函数,我想调用push_back;否则,如果类已经交换,我想调用resize + back + swap,否则我想调用push_back(只有最后一个push_back是缓慢的,因为它正在做一个大副本)。我想使它适用于C++ 98库中的类(我无法在不更改其源代码的情况下添加缺少的移动构造函数,并且这会很麻烦)。 – pts