为什么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 empty
、clear
或 clean
),使用 C++17 的 [[nodiscard]]
属性对于指示不当行为非常有用。
例如,empty()
,如 std::vector
– 执行 查询 的成员函数,因此,return 是一个值 –可以标记为[[nodiscard]]
,这样如果不使用return值,编译器会发出警告。此警告表明程序员可能使用 empty()
就好像它确实清空了容器,但它实际上查询了容器是否为空。
但是请注意,编译器不需要发出警告。
empty()
STL 方法的创建者似乎不知道,或者决定不遵循有用的命名约定,即布尔变量和函数的名称以动词开头。正如您所指出的,empty()
是一个含糊不清的名称,因为 'empty' 一词也用作动词,因此它可以暗示一个动作,就像它暗示一个查询一样,如果不是更多的话。 is_empty()
可以通过清楚地指示该方法执行查询来消除这种歧义。不幸的是,现在STL已经用这个命名约定标准化了。
请检查 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 empty
、clear
或 clean
),使用 C++17 的 [[nodiscard]]
属性对于指示不当行为非常有用。
例如,empty()
,如 std::vector
– 执行 查询 的成员函数,因此,return 是一个值 –可以标记为[[nodiscard]]
,这样如果不使用return值,编译器会发出警告。此警告表明程序员可能使用 empty()
就好像它确实清空了容器,但它实际上查询了容器是否为空。
但是请注意,编译器不需要发出警告。
empty()
STL 方法的创建者似乎不知道,或者决定不遵循有用的命名约定,即布尔变量和函数的名称以动词开头。正如您所指出的,empty()
是一个含糊不清的名称,因为 'empty' 一词也用作动词,因此它可以暗示一个动作,就像它暗示一个查询一样,如果不是更多的话。 is_empty()
可以通过清楚地指示该方法执行查询来消除这种歧义。不幸的是,现在STL已经用这个命名约定标准化了。