为什么要删除非成员函数?
Why delete a non-member function?
这是关于非成员函数的。我做 understand this 作为一个实现。但是我对背后的逻辑有点困惑?
// 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
会 return 对将被销毁的对象的引用。要禁止这种情况,我们需要删除 cref
临时传递的函数,这就是第二个删除的重载所做的。
这是关于非成员函数的。我做 understand this 作为一个实现。但是我对背后的逻辑有点困惑?
// 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
会 return 对将被销毁的对象的引用。要禁止这种情况,我们需要删除 cref
临时传递的函数,这就是第二个删除的重载所做的。