在C++11标准中,通过在类内声明默认的构造、析构、移动构造、拷贝构造、移动赋值、拷贝赋值等特殊成员函数来控制对象的构造、析构和复制。但是在MSVC编译器中,如果同时声明了多个特殊成员函数版本,就会出现'multiple versions of a defaulted special member functions are not allowed”错误。
例如:
class Test {
public:
Test() = default;
Test(int x) {}
Test(const Test& t) = default;
Test(Test&& t) = default;
~Test() = default;
};
上述类声明中有两个构造函数,其中一个是默认构造函数,另一个包含了一个参数。然而,这会导致编译错误。
解决这个问题的方法是:只能为这些特殊成员函数定义一种版本,在需要的时候使用=default语法声明并定义它们。
例如:
class Test {
public:
Test() = default;
Test(const Test& t) = default;
Test(Test&& t) = default;
~Test() = default;
Test& operator=(const Test& t) = default;
Test& operator=(Test&& t) = default;
};
这将只定义一个默认的构造函数,一个默认的拷贝构造函数,一个默认的移动构造函数,一个默认的析构函数和两个默认的赋值操作符。