为什么STL"空"成员函数不叫"isEmpty"?
Why is STL "empty" member function not called "isEmpty"?
请检查std::vector
cplusplus.com。
它说它有一个empty()
成员函数:
empty
Test whether vector is empty (public member function )
http://www.cplusplus.com/reference/vector/vector/empty/
Signature : bool empty() const;
对我来说,空洞的意义应该是从这个容器中删除所有元素。但是,这是一个测试函数,用于检查容器是否为空。 我检查了所有其他容器,并且都以相同的方式使用空容器。
为什么 stl 不使用isEmpty()
代替?
大小写样式
为了与C++标准库的命名约定保持一致,我实际上会将您引用的成员函数洗礼为is_empty()
而不是isEmpty()
。也就是说,遵循蛇案命名约定而不是骆驼案命名约定。我们可以在其他成员函数中看到此约定,例如push_back()
和pop_back()
。
请注意,有一个名为clear()
的成员函数确实清空了容器。也许省略动词(即假设is_empty
的is)并因此需要较少键入的原因,是用于查询容器是否为空(即empty()
)和清空容器(即clear()
)的名称分离。
否则,如果将单词"empty"用于查询和更新,则谓词可能是用于查询的成员函数名称的一部分,因为两个成员函数都没有参数。因此,超载是不可能的。然后,成员函数可能会被调用empty()
和is_empty()
,分别用于清空容器和查询它是否为空。
[[nodiscard]]
属性
在这些情况下,成员函数的名称同时对应于形容词和动词(例如,名称为empty
、clear
或clean
的成员函数),使用 C++17 的[[nodiscard]]
属性对于表示不当行为非常有用。
例如,empty()
如std::vector
– 执行查询并因此返回值的成员函数 – 可以标记为[[nodiscard]]
,以便在不使用返回值时编译器发出警告。此警告表示程序员可能已经使用了empty()
,就好像它确实清空了容器一样,但它实际上查询容器是否为空。
但请注意,编译器不需要发出警告。
empty()
STL 方法的创建者似乎不知道或决定不遵循有用的命名约定,即将布尔变量和函数的名称视为以动词开头。 正如您所指出的,empty()
是一个模棱两可的名称,因为"空"一词也用作动词,因此它可以建议一个动作,就像它建议查询一样多,如果不是更多的话。is_empty()
可以通过清楚地指示该方法执行查询来消除这种歧义。不幸的是,现在 STL 已经按照这种命名约定进行了标准化。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 为什么STL"空"成员函数不叫"isEmpty"?