保留的函数名称可以重载吗?

Can reserved function names be overloaded?

本文关键字:重载 函数 保留      更新时间:2023-10-16

这个问题是这个问题的后续问题。

请考虑以下程序:

#include <cmath>
// meaningless, only for language-lawyer purpose
void abs(void*) {}
int main(){
abs(nullptr);
}

此程序是否会导致未定义的行为?


标准中的相关部分是 [extern.names]/4:

使用外部链接声明的 C 标准库中的每个函数签名都保留给实现,以用作具有外部"C"和外部"C++"链接的函数签名,或用作全局命名空间中命名空间范围的名称

我不确定是否允许重载。

这个语句有两个部分,因为它谈论的是保留的名称(来自 C 标准((用于C++实现(。特别

第 1 部分:声明的 C 标准库中的每个函数签名 带外部链接

这包括 C 库函数abs

第 2 部分:保留给实现以用作函数 同时具有外部"C"和外部"C++"链接的签名,或作为名称 全局命名空间中的命名空间范围。

因此,名称::abs是为C++实现保留的。你不能使用它。重载无关紧要。

tl;博士- 是的,你可以

http://www.eel.is/c++draft/reserved.names#extern.names

拉入上下文的其余部分:

20.5.4.3.2:如果程序在保留它的上下文中声明或定义名称,则除非此子句明确允许,则其行为是未定义的。

然后也

20.5.4.3.3.2 在标头中用外部链接声明的每个全局函数签名都保留给实现,以指定具有外部链接的函数签名。

20.5.4.3.3.4 用外部链接声明的C标准库中的每个函数签名都保留给实现,以用作具有外部"C"和外部"C++"链接的函数签名,182或作为全局命名空间中命名空间范围的名称。

这些建议你可以,因为它只是保留的签名。

命名空间的奖励 ::std

http://www.eel.is/c++draft/library#namespace.std

20.5.4.2.1.1 除非另有说明,否则如果C++程序将声明或定义添加到命名空间 std 或命名空间 std 内的命名空间,则未定义该程序的行为。

http://en.cppreference.com/w/cpp/language/extending_std 总结了例外情况