以下是使类不可复制的四种方法:
#include <stdio.h>
#include <type_traits>
class A {
public:
A(const A&) = delete;
void operator=(const A&) = delete;
};
class B {
private:
B(const B&) = delete;
void operator=(const B&) = delete;
};
class C {
public:
C(const C&) = delete;
void operator=(const C&) = delete;
void operator=(C) = delete;
};
class D {
private:
D(const D&) = delete;
void operator=(const D&) = delete;
void operator=(D) = delete;
};
int main() {
printf("%d %d\n", std::is_copy_constructible<A>::value, std::is_copy_assignable<A>::value);
printf("%d %d\n", std::is_copy_constructible<B>::value, std::is_copy_assignable<B>::value);
printf("%d %d\n", std::is_copy_constructible<C>::value, std::is_copy_assignable<C>::value);
printf("%d %d\n", std::is_copy_constructible<D>::value, std::is_copy_assignable<D>::value);
}
在 MSVC2013 x64 ( 18.00.40629 for x64
) 上,它打印:
1 1 //A
0 1 //B
1 0 //C
0 0 //D
在适当的编译器上,所有八个值都必须为零。
不幸的是,这并没有提供解决 MSVC2013 中错误的好方法,即使对于您自己的类也是如此。因为如果您声明赋值运算符按值接受参数,那么您不能在同一个类中声明移动赋值(由于不明确的重载,任何移动赋值都不会编译)。
PS修复分配的关键思想来自这个相关的答案。