为什么删除非成员函数?

8 c++ function delete-operator c++17

这是关于非成员函数.我确实理解这是一个实现.但我对背后的逻辑有点困惑?

     // why this?
     void do_not_use_this_ever ( void ) = delete ;
Run Code Online (Sandbox Code Playgroud)

如果我不想使用某个函数,为什么要声明它然后删除呢?为什么不呢:

     // why not this?
     // void do_not_use_this_ever ( void ) = delete ;
Run Code Online (Sandbox Code Playgroud)

如果= delete声明一个意图,只需像上面的注释声明相同的意图.

任何人都可以想到一个用例,将非成员函数声明为删除更好,然后根本没有它?

更新

在这里回答.虽然.两个答案都std::cref用作例子.正如@geza在评论中所说的那样,讨论其他用例也是相当有益的.

gez*_*eza 5

删除非成员函数对于禁用具有某些参数的函数非常有用.例如,这是std :: cref:

template< class T >
std::reference_wrapper<const T> cref( const T& t ) noexcept;
template <class T>
void cref(const T&&) = delete;
Run Code Online (Sandbox Code Playgroud)

cref用于将对象引用转换为reference_wrapper.例如,可以使用此参数std::bind:将std::bind参数复制到结果对象中.但是cref,它只是一个参考.因此,cref不得与临时参数一起使用.

如果没有删除第二个重载,那么例如,cref(2)将是一个有效的表达式(作为临时可以绑定到const引用).这是一个问题,因为cref它将返回对将被销毁的对象的引用.要禁止这一点,我们需要删除cref传递临时的函数,这是第二个删除的重载.