为什么要删除非成员函数?

时间:2018-08-04 06:46:51

标签: c++ function c++17 delete-operator

这是关于非成员函数的。我将understand this作为实现。但是我对背后的逻辑有些疑惑吗?

     // why this?
     void do_not_use_this_ever ( void ) = delete ;

如果我不希望使用函数,为什么要声明它然后将其删除?为什么不只是:

     // why not this?
     // void do_not_use_this_ever ( void ) = delete ;

如果= delete声明了一个意图,则仅像上面的注释一样声明一个意图。

谁能想到一个用例,将一个非成员函数声明为已删除比根本不使用它更好?

更新

已经回答here。虽然。两个答案都以std::cref为例。正如@geza在对他的回答的评论中所说,讨论其他用例也将非常有益。

1 个答案:

答案 0 :(得分:5)

删除非成员函数对于禁用带有某些参数的函数很有用。例如,这里是std::cref

printf '%s\n' "${files[@]##*/}" # i.e. filename.tgz

@Inject public SalutDataReceiver(Activity activity, SalutDataCallback dataCallback) { } 用于将对象引用转换为template< class T > std::reference_wrapper<const T> cref( const T& t ) noexcept; template <class T> void cref(const T&&) = delete; 。例如,这可以与cref一起使用:reference_wrapper参数被复制到结果对象中。但是使用std::bind,它仅成为参考。因此,std::bind不能与临时参数一起使用。

如果未删除第二个重载,则cref将是有效的表达式(因为可以将临时绑定到const引用)。这是一个问题,因为cref将返回对将被销毁的对象的引用。为禁止这种情况,我们需要删除临时传递了cref(2)的函数,这就是第二个删除的重载的作用。