为什么std :: forward_list ::: remove和std :: erase <std :: forward_list>具有不同的值类型?

xmllmx

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用于UvalueremoveTvalue

为什么std::erase不只将typeT用于value

不一致背后是否有任何设计依据?

讲故事的人-Unslander Monica

我可以看到一个实际的原因。这与模板自变量推导带来的困难有关。想象一下这个假设功能:

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是一个整数,它不匹配的doubleremove期待。但是,这不是问题。因为remove是具体专业化的常规成员函数,所以隐式转换是可能的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Gnome的gslist比std :: forward_list有什么优势?

来自分类Dev

C ++ STL-为什么std :: forward_list没有size()方法?

来自分类Dev

std :: forward_list和序列概念要求

来自分类Dev

O(1)之后std :: forward_list的emplace_如何?

来自分类Dev

如何删除存储在std :: forward_list中的动态元素

来自分类Dev

为什么return {};不适用于std :: forward_list?

来自分类Dev

为什么`return {};`不适用于`std :: forward_list`?

来自分类Dev

您可以在遍历std :: forward_list时将其删除吗?

来自分类Dev

是否在空std :: forward_list中定义了before_begin()之后的元素?

来自分类Dev

std :: forward_list是否支持手动重新指向?

来自分类Dev

为什么std :: forward()不演绎类型?

来自分类Dev

带有指向自身的指针的 forward_list 结构

来自分类Dev

如果从forward_list中仅单个元素,如何有效地将remove_删除?

来自分类Dev

为什么std :: forward有两个重载?

来自分类Dev

std :: move,std :: forward,值类型和模板推导

来自分类Dev

为什么要使用std :: forward?

来自分类Dev

为什么不总是使用std :: forward?

来自分类Dev

为什么std :: list具有最大大小?

来自分类Dev

xlc是否支持forward_list

来自分类Dev

为什么C ++ 11中的std :: initializer_list重载了std :: begin()和std :: end()?

来自分类Dev

使用std :: copy复制std :: list并使用std :: list :: erase删除

来自分类Dev

std :: forward_list.push_front(std :: thread)无法编译

来自分类Dev

std :: forward_list.push_front(std :: thread)无法编译

来自分类Dev

为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element

来自分类Dev

为什么与使用char一起使用forward_list比长时间使用它要优化得多?

来自分类Dev

Std::forward 和模板类型推导

来自分类Dev

为什么 std::list<string> 有效但 std::list<int> 无效

来自分类Dev

std :: list iterator.erase()导致无效的指针

来自分类Dev

C ++-std :: list.erase()不删除元素

Related 相关文章

  1. 1

    Gnome的gslist比std :: forward_list有什么优势?

  2. 2

    C ++ STL-为什么std :: forward_list没有size()方法?

  3. 3

    std :: forward_list和序列概念要求

  4. 4

    O(1)之后std :: forward_list的emplace_如何?

  5. 5

    如何删除存储在std :: forward_list中的动态元素

  6. 6

    为什么return {};不适用于std :: forward_list?

  7. 7

    为什么`return {};`不适用于`std :: forward_list`?

  8. 8

    您可以在遍历std :: forward_list时将其删除吗?

  9. 9

    是否在空std :: forward_list中定义了before_begin()之后的元素?

  10. 10

    std :: forward_list是否支持手动重新指向?

  11. 11

    为什么std :: forward()不演绎类型?

  12. 12

    带有指向自身的指针的 forward_list 结构

  13. 13

    如果从forward_list中仅单个元素,如何有效地将remove_删除?

  14. 14

    为什么std :: forward有两个重载?

  15. 15

    std :: move,std :: forward,值类型和模板推导

  16. 16

    为什么要使用std :: forward?

  17. 17

    为什么不总是使用std :: forward?

  18. 18

    为什么std :: list具有最大大小?

  19. 19

    xlc是否支持forward_list

  20. 20

    为什么C ++ 11中的std :: initializer_list重载了std :: begin()和std :: end()?

  21. 21

    使用std :: copy复制std :: list并使用std :: list :: erase删除

  22. 22

    std :: forward_list.push_front(std :: thread)无法编译

  23. 23

    std :: forward_list.push_front(std :: thread)无法编译

  24. 24

    为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element

  25. 25

    为什么与使用char一起使用forward_list比长时间使用它要优化得多?

  26. 26

    Std::forward 和模板类型推导

  27. 27

    为什么 std::list<string> 有效但 std::list<int> 无效

  28. 28

    std :: list iterator.erase()导致无效的指针

  29. 29

    C ++-std :: list.erase()不删除元素

热门标签

归档