= delete有什么用途?

Ole*_*siy 12 c++ delete-operator c++11

今天早些时候我问另一个问题:我=delete什么时候应该使用?我认为没有专门针对=deleteSO 的帖子,所以我在一本名为"The C++ Programming Language"的书中查阅了它.我将在下面的答案中列出我的发现.

如果有更多话要说或者我错了,请评论或回答.

Ole*_*siy 29

事实证明这=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

}
Run Code Online (Sandbox Code Playgroud)

当模板函数无法使用某种类型运行时,它也很有用:

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
}
Run Code Online (Sandbox Code Playgroud)

=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

}
Run Code Online (Sandbox Code Playgroud)

一些更高级的用法=delete包括禁止堆栈或免费存储分配:

class FS_Only {
    ~FS_Only() = delete;  // disallow stack allocation
};

class Stack_Only {
    void* operator new(size_t) = delete;   // disallow heap allocation
};
Run Code Online (Sandbox Code Playgroud)

......你明白了.希望这有助于某人!=delete可以帮助编写可读,无缺陷和优雅的代码.


编辑:

正如在评论中正确指出的那样,现在不可能删除FS_Only对象,所以这个对象=delete毕竟不是很好用.

  • 当您"删除"在堆上分配的对象时,也会调用析构函数,因此通过将析构函数标记为已删除,您可以创建一个可用于在堆上分配但*从不*删除的类. (4认同)
  • @ AndonM.Coleman老实说,我不知道为什么它会被认为是复杂的(是否重用关键字?如果是这样,上下文线索会对此有所帮助).对于C++语法,语法非常清晰.我很确定C语言有更复杂的语法,比如函数指针. (4认同)