C++ 11 deleted函数

template <class charT, class traits = char_traits<charT> >
class basic_ios : public ios_base {
public:
…
basic_ios(const basic_ios& ) = delete;
basic_ios& operator=(const basic_ios&) = delete;
…
};

       ⽤ = delete 将拷⻉构造函数和拷⻉赋值运算符标记为 deleted 函数。

       deleted 函数不能以任何⽅式被调⽤,即使你在成员函数或者友元函数⾥⾯调⽤,deleted 函数也不能通过编译。

      通常, deleted 函数被声明为public而不是private.这也是有原因的。当客⼾端代码试图调⽤成员函数,C++会在检查 deleted 状态前检查它的访问性。当客⼾端代码调⽤⼀个私有的 deleted 函数,⼀些编译器只会给出该函数是private的错误(译注:而没有诸如该函数被 deleted 修饰的错误),即使函数的访问性不影响它的使⽤。所以值得牢记,如果要将⽼代码的"私有且未定义"函数替换为 deleted 函数时请⼀并修改它的访问性为public,这样可以让编译器产⽣更好的错误信息。

        deleted 函数还有⼀个重要的优势是任何函数都可以标记为 deleted 。

bool isLucky(int number);

C++有沉重的C包袱,使得含糊的、能被视作数值的任何类型都能隐式转换为 int ,但是有⼀些调⽤可能是没有意义的:

if (isLucky('a')) … // 字符'a'是幸运数?
if (isLucky(true)) … // "true"是?
if (isLucky(3.5)) … // 难道判断它的幸运之前还要先截尾成3?

如果幸运数必须真的是整数,我们该禁⽌这些调⽤通过编译。其中⼀种⽅法就是创建 deleted 重载函数,其参数就是我们想要过滤的类型:

bool isLucky(int number); // 原始版本
bool isLucky(char) = delete; // 拒绝char
bool isLucky(bool) = delete; // 拒绝bool
bool isLucky(double) = delete; // 拒绝float和double

       上⾯double重载版本的注释说拒绝float和double可能会让你惊讶,但是请回想⼀下:将 float 转换为int 和 double ,C++更喜欢转换为 double 。使⽤ float 调⽤ isLucky 因此会调⽤ double 重载版本,而不是 int 版本。好吧,它也会那么去尝试。事实是调⽤被删除的 double 重载版本不能通过编译。不再惊讶了吧。

        虽然 deleted 寒暑假不能被使⽤,它它们还是存在于你的程序中。也即是说,重载决议会考虑它们。这也是为什么上⾯的函数声明导致编译器拒绝⼀些不合适的函数调⽤。

if (isLucky('a')) … //错误! 调⽤deleted函数
if (isLucky(true)) … // 错误!
if (isLucky(3.5f)) … // 错误!

        最后,任何函数都能 delete。特别是可以在构造函数后面加。

	class CTest
	{
		CTest() = delete;
    }

本文源自《Effective Modern C++》一书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值