本文原文来自《深入理解c++11》中有关于=default和=delete的章节,本文做一个大致的整理,描述他们的大概语义,方便在编程过程中正确使用
/*
一个类默认有如下函数:
构造函数
拷贝构造函数
拷贝赋值函数(operator=)
移动构造函数
此外,c++编译器还会为以下这些自定义类型提供全局默认构造函数
operator
operator &
operator &&
operator *
operator->
operator->*
operator new
operator delete
注意:若是程序员声明了自定义版本的构造函数,则有可能导致定义的类型不再是pod类型的
*/
#include<type_traits>
#include<iostream>
using namespace std;
class TowCstor
{
public:
//在提供了带参版本的构造函数,则必须自行提供不带参数的版本,另外由于加入了自定义的带参版本,因而T
//TowCstor不再是POD类型
TowCstor() =default;
TowCstor(int i):data(i){}
private:
int data;
};
// int main()
// {
// cout<<is_pod<TowCstor>::value<<endl;
// }
/*
有的时候我们希望限制一些默认函数的生成。最典型的时类的编写者有时需要禁止使用者使用拷贝构造函数,
之前我们的做法是将拷贝构造函数声明为private,并不提供实现。这样,如果有人想要使用拷贝构造函数,
编译器就会报错
*/
class NoCopyCstor
{
public:
NoCopyCstor() =default;
private:
NoCopyCstor(const NoCopyCstor&);
};
//int main()
//{
// NoCopyCstor a;
// NoCopyCstor b(a); //编译报错
//}
/*
上面的私有化拷贝构造函数可能会对友元类或者是函数造成麻烦。为了避免这种情况,我们在private的基础上
实现拷贝构造函数
而c++11 提供了 =delete 指示编译器不产生函数的却行版本。
*/
class NoCopyCstor2
{
public:
NoCopyCstor2() =default;
NoCopyCstor2(const NoCopyCstor2&) =delete;
private:
};
int main()
{
NoCopyCstor2 a;
NoCopyCstor2 b(a); //编译报错
return 0;
}
/*
一个类默认有如下函数:
构造函数
拷贝构造函数
拷贝赋值函数(operator=)
移动构造函数
此外,c++编译器还会为以下这些自定义类型提供全局默认构造函数
operator
operator &
operator &&
operator *
operator->
operator->*
operator new
operator delete
注意:若是程序员声明了自定义版本的构造函数,则有可能导致定义的类型不再是pod类型的
*/
#include<type_traits>
#include<iostream>
using namespace std;
class TowCstor
{
public:
//在提供了带参版本的构造函数,则必须自行提供不带参数的版本,另外由于加入了自定义的带参版本,因而T
//TowCstor不再是POD类型
TowCstor() =default;
TowCstor(int i):data(i){}
private:
int data;
};
// int main()
// {
// cout<<is_pod<TowCstor>::value<<endl;
// }
/*
有的时候我们希望限制一些默认函数的生成。最典型的时类的编写者有时需要禁止使用者使用拷贝构造函数,
之前我们的做法是将拷贝构造函数声明为private,并不提供实现。这样,如果有人想要使用拷贝构造函数,
编译器就会报错
*/
class NoCopyCstor
{
public:
NoCopyCstor() =default;
private:
NoCopyCstor(const NoCopyCstor&);
};
//int main()
//{
// NoCopyCstor a;
// NoCopyCstor b(a); //编译报错
//}
/*
上面的私有化拷贝构造函数可能会对友元类或者是函数造成麻烦。为了避免这种情况,我们在private的基础上
实现拷贝构造函数
而c++11 提供了 =delete 指示编译器不产生函数的缺省版本。 (你可以理解为 把对应被修饰的函数“删掉”)
*/
class NoCopyCstor2
{
public:
NoCopyCstor2() =default;
NoCopyCstor2(const NoCopyCstor2&) =delete;
private:
};
int main()
{
NoCopyCstor2 a;
NoCopyCstor2 b(a); //编译报错
return 0;
}