c++ - 为什么要删除非成员函数?
问题描述
这是关于非成员函数的。我确实将其理解为一种实现。但我对背后的逻辑有点疑惑?
// why this?
void do_not_use_this_ever ( void ) = delete ;
如果我不想使用某个函数,为什么要声明它然后删除它?为什么不只是:
// why not this?
// void do_not_use_this_ever ( void ) = delete ;
如果= delete
声明了一个意图,只需像上面这样的注释就声明了相同的意图。
谁能想到一个用例,其中将非成员函数声明为已删除比根本没有它更好?
更新
已经在这里回答了。虽然。两个答案都std::cref
用作示例。正如@geza 在对他的回答的评论中所说,讨论其他用例也是相当有益的。
解决方案
删除非成员函数对于禁用具有某些参数的函数很有用。例如,这里是std::cref:
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
,它就变成了一个参考。因此,cref
不得与临时参数一起使用。
例如,如果第二个重载没有被删除,那么cref(2)
它将是一个有效的表达式(因为临时可以绑定到 const 引用)。这是一个问题,因为cref
会返回对将被销毁的对象的引用。为了禁止这种情况,我们需要删除cref
传递一个临时值的函数,这就是第二个删除的重载所做的。
推荐阅读
- reactjs - 使用 react-testing 库测试到达路由器的导航
- python - AttributeError:“PngImageFile”对象没有属性“形状”
- rust - 如何在 rust/tokio 的 TCP 客户端绑定()?
- javascript - 如何为单选按钮添加答案?
- mysql - 如何从多个表中删除数据?
- c++ - 当 Vector 超出范围时,系统调用参数 read(buf) 指向不可寻址字节
- python - 有没有办法使用 Selenium 在线上传 .pdf 文件?
- mysql - 连接关闭错误后不允许操作的原因?
- c# - Bot 在 Web 客户端中启动时不欢迎用户加入
- rest - LDAP 到 REST 集成