C++ boost::noncopyable\:用于移动构造函数/赋值的noncopyable模拟

C++ boost::noncopyable\:用于移动构造函数/赋值的noncopyable模拟,c++,boost,C++,Boost,通过继承boost::noncopyable\uuu::noncopyable,可以快速使类型不可复制。有没有类似的方法来防止类型可移动?如果声明的是复制构造函数而不是移动构造函数,则不会生成移动构造函数。任务也一样。因此: struct not_movable { not_movable(const not_movable&) = default; not_movable& operator=(const not_movable&) = default;

通过继承
boost::noncopyable\uuu::noncopyable
,可以快速使类型不可复制。有没有类似的方法来防止类型可移动?

如果声明的是复制构造函数而不是移动构造函数,则不会生成移动构造函数。任务也一样。因此:

struct not_movable {
    not_movable(const not_movable&) = default;
    not_movable& operator=(const not_movable&) = default;
};

您可以通过将move构造函数设置为私有来实现这一点。不过,你为什么要这样做?@Taywee:为了保证我程序中的某些类不可能被不当使用。这些类有一个相当复杂的“所有权关系”系统,如果我允许移动语义,它将被完全破坏。请记住,许多容器类型在内部使用移动构造,如向量,因此这些也是禁止的。在c++11中,您还可以显式删除移动构造函数:
not_movable(const not_movable&&)=delete显然,我不想让常量出现在那里:
不可移动(不可移动&&)=删除我无法创建(有意义的)复制构造函数/赋值对。我的类已经有了不可复制的成员(例如,
std::map
),这就是为什么我只关心使其不可移动的原因。在这种情况下,删除显式移动构造函数或私有移动构造函数就足够了。@Taywee-不要删除移动构造函数。你会得到非常令人惊讶的结果<代码>不可移动f();不可移动nm=f()最后一条语句是错误的;它不使用复制构造函数,但尝试使用已删除的移动构造函数。