今天早些时候,我提出了一个问题,链接地址为这里。这个问题引发了另外一个问题:什么时候应该使用=delete
?我认为在SO网站上没有专门介绍=delete
的文章,因此我查阅了一本名为“C++程序设计语言”的书籍,并将我的研究结果列在下面的答案中。
如果还有其他需要补充的内容或者我理解有误,请评论或回答。
今天早些时候,我提出了一个问题,链接地址为这里。这个问题引发了另外一个问题:什么时候应该使用=delete
?我认为在SO网站上没有专门介绍=delete
的文章,因此我查阅了一本名为“C++程序设计语言”的书籍,并将我的研究结果列在下面的答案中。
如果还有其他需要补充的内容或者我理解有误,请评论或回答。
原来=delete
非常有用!以下是几个例子:
基本上我们可以通过这种方式防止复制基类,因为它经常会导致切片问题:
struct Base {
Base(){}
Base& operator=(const Base&) = delete; // disallow copying
Base(const Base&) = delete;
Base& operator=(Base && ) = delete; // disallow moving
Base(Base && ) = delete;
};
struct Der : public Base {};
void func() {
Der d;
Base base = d; // this won't work because the copy constructor is deleted!
// this behavior is desired - otherwise slicing would occur
}
当模板函数无法使用某种类型时,这个时候也是很有用的:
template<class T>
void fn(T p) { /* ... */ }; // do something with T
void fn(int) = delete; // disallow use with int
void fun() {
fn(4); // aha! cannot use fn() with int!
fn(-4.5); // fine
fn("hello");// fine
}
=delete
可以防止非预期的类型转换:
struct Z {
Z(double); // can initialize with a double
Z(int) = delete; // but not with an integer
};
void f() {
Z z1 { 1 }; // error! can't use int
Z z2 { 1.0 }; // double is ok
}
class FS_Only {
~FS_Only() = delete; // disallow stack allocation
};
class Stack_Only {
void* operator new(size_t) = delete; // disallow heap allocation
};
我希望这篇文章能对某些人有所帮助!=delete
可以帮助编写易读、无bug和优雅的代码。
编辑:
正如评论中正确指出的那样,现在不可能删除FS_Only
对象,因此这并不是一个很好的使用=delete
的例子。
delete
删除堆上分配的对象时,也会调用析构函数。因此,通过将析构函数标记为已删除,您可以创建一个类,可以用于在堆上分配内存,但永远不会被删除。 - Some programmer dude
=default
和=delete
的作用。这篇文章是关于=delete
的实际用途。很容易理解=delete
禁止使用该函数,但你为什么要这样做呢?这篇文章回答了为什么。 - Oleksiy