std::forward_list
具有成员函数:
size_type remove(const T& value);
和一个非成员函数 std::erase
声明如下:
template<class T, class Alloc, class U>
typename forward_list<T, Alloc>::size_type
erase(forward_list<T, Alloc>& c, const U& value);
请注意,非成员函数的;std::erase
类型不同。而成员函数仅将type用于。U
value
remove
T
value
为什么std::erase
不只将typeT
用于value
?
不一致背后是否有任何设计依据?
我可以看到一个实际的原因。这与模板自变量推导带来的困难有关。想象一下这个假设功能:
template<typename T>
void foo(std::forward_list<T> const&, T const&) {}
您从此调用中得到什么?
std::forward_list<double> l;
foo(l, 1);
答案是在模板参数推导中出现错误。根据一个参数T
是double,但是根据另一个参数,它是int。如果我要编写代码erase
,那么我也将使用两个不同的模板参数,以避免在纯真的代码中出现此类问题。
现在remove
不是成员模板,它是任何专业化的常规成员函数。因此,您可以毫无问题地编写:
std::forward_list<double> l;
// later
l.remove(1);
1
是一个整数,它不匹配的double
是remove
期待。但是,这不是问题。因为remove
是具体专业化的常规成员函数,所以隐式转换是可能的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句