gpt4 book ai didi

c++ - 为什么std::forward_list::: remove和std::erase 具有不同的值类型?

转载 作者:行者123 更新时间:2023-12-02 09:49:47 25 4
gpt4 key购买 nike

std::forward_list具有member function:

size_type remove(const T& value);

和一个 non-member function 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::eraseU具有不同的 value类型;而成员函数 remove仅将 T类型 value用作。

为什么 std::erase不只将 T类型用作 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是具体特化的常规成员函数,所以隐式转换是可能的。

关于c++ - 为什么std::forward_list::: remove和std::erase <std::forward_list>具有不同的值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61161905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com