为什么STL"空"成员函数不叫"isEmpty"?

Why is STL "empty" member function not called "isEmpty"?

本文关键字:isEmpty 成员 STL 为什么 函数      更新时间:2023-10-16

请检查std::vectorcplusplus.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_emptyis)并因此需要较少键入的原因,是用于查询容器是否为空(即empty())和清空容器(即clear())的名称分离。

否则,如果将单词"empty"用于查询和更新,则谓词可能是用于查询的成员函数名称的一部分,因为两个成员函数都没有参数。因此,超载是不可能的。然后,成员函数可能会被调用empty()is_empty(),分别用于清空容器和查询它是否为空。


[[nodiscard]]属性

在这些情况下,成员函数的名称同时对应于形容词和动词(例如,名称为emptyclearclean的成员函数),使用 C++17 的[[nodiscard]]属性对于表示不当行为非常有用。

例如,empty()std::vector– 执行查询并因此返回值的成员函数 – 可以标记为[[nodiscard]],以便在不使用返回值时编译器发出警告。此警告表示程序员可能已经使用了empty(),就好像它确实清空了容器一样,但它实际上查询容器是否为空。

但请注意,编译器不需要发出警告。

empty()STL 方法的创建者似乎不知道或决定不遵循有用的命名约定,即将布尔变量和函数的名称视为以动词开头。 正如您所指出的,empty()是一个模棱两可的名称,因为"空"一词也用作动词,因此它可以建议一个动作,就像它建议查询一样多,如果不是更多的话。is_empty()可以通过清楚地指示该方法执行查询来消除这种歧义。不幸的是,现在 STL 已经按照这种命名约定进行了标准化。