为什么STL"empty"成员函数没有被调用"isEmpty"?

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

请检查 cplusplus.com 中的 std::vector

它说它有一个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()。也就是说,在 snake case naming convention instead of the camel case 之后。我们可以在其他成员函数中看到这种约定,例如 push_back()pop_back().


请注意,有一个名为 clear() 的成员函数 empty 容器。也许省略动词的原因(即假设的 is_empty),因此需要较少的打字,是 [ 的名称分离=46=]查询容器是否为空(即empty())和清空容器(即 clear())。

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


[[nodiscard]] 属性

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

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

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

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