所有这三个容器都通过const引用接受一个函数对象,而不是值或转发引用。这导致需要将函数对象复制到容器的内部存储器中(最多两次)。
有两次复制功能对象的原因吗?而不是让用户能够传递任何类型的函数对象并将其构建到内部仿函数存储中?这样,图书馆就更加通用,用户也不会感到意外。
在push_back()
函数中应用了相同的哲学 - 它们有两个重载,一个带有const引用,另一个带有右值引用,因为这可以让用户更好地控制是否要移动值或复制价值。在没有对用例进行任何假设的情况下,库在一般情况下仍然有效。
我怀疑这是一个自C ++前11天以来一直在进行的设计决策。改变这个标准会是一个不错的提议吗?
答案 0 :(得分:0)
通常,比较器是一个非常小的对象,复制起来很便宜,而且你只需要构建一次容器。一次额外的一份副本不会真正重要。您可能不会在延迟敏感代码中创建一堆std::map
。因此,为这些容器引入更多构造函数并没有带来很多好处。这样的提案会是什么样子?那么您是否也希望通过右值参考获取Allocator
?现在我们正在添加更多的构造函数。更改所有采用Compare const&
的构造函数而不是采用约束转发引用?现在,我们打破ABI仍然是边际的,如果有的话,获利。构造函数很复杂。我甚至不相信如果今天设计std::map
,那么界面在这方面看起来会有所不同。如果有的话,我们可能只是按值Compare
而不是const&
。
另一方面,push_back
在程序的主运行时期间使用了很多类型的LOT。能够进入vector
或emplace
进入vector
是一个巨大的胜利。这两种情况并不具有可比性。