【发布时间】:2011-12-10 21:10:11
【问题描述】:
std::forward_list 提供 insert_after 和 erase_after 成员,它们可能不需要实际访问 std::forward_list 对象。因此,它们可以实现为static 成员函数,并且可以在没有列表对象的情况下调用——这对于想要从列表中删除自身的对象很有用,这是一种非常常见的用途。 编辑:此优化仅适用于std::allocator 上的forward_list 特化或用户定义的无状态分配器。
符合标准的实现可以做到这一点吗?
§17.6.5.5/3 说
对 C++ 标准库中描述的成员函数签名的调用就像实现 声明没有额外的成员函数签名。
带脚注
一个有效的 C++ 程序总是调用预期的库成员函数,或具有等效行为的函数。实现还可以定义其他成员函数,否则有效的 C++ 程序不会调用这些函数。
我不清楚添加 static 是否会创建一个“不同的”成员函数,但删除(隐式)参数不应破坏添加默认参数不会破坏的任何内容,这是合法的。 (您不能合法地将 PTMF 带入任何标准成员函数。)
我觉得应该允许图书馆这样做,但我不确定是否会违反某些规则。列出的成员函数原型有多规范?
【问题讨论】:
-
变异列表操作需要访问列表的分配器,所以我怀疑它们可能是静态的(尤其是新的有状态分配器)。
-
不过,模板可以专门用于
std::allocator的极其常见的情况,如果需要,用户也可以自己使用。 -
仅凭关于 iterator 的知识,您将如何专门处理此问题?迭代器不知道它属于哪个列表,也不知道该列表使用哪个分配器。
-
@KerrekSB 仅给定迭代器,您将需要使用特定于静态成员函数的调用语法,这将是非标准的。该模板将专门用于分配器是
std::allocator的知识,它始终是无状态的。 -
与这个话题相关的是Scott Meyers的一篇文章,“How Non-Member Functions Improve Encapsulation”,非常值得一读。
标签: c++ c++11 c++-standard-library