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

xsk*_*xzr 8 c++ reserved-words c++-standard-library language-lawyer

这个问题的后续问题这一个.

考虑以下程序:

#include <cmath>

// meaningless, only for language-lawyer purpose
void abs(void*) {}

int main(){
    abs(nullptr);
}
Run Code Online (Sandbox Code Playgroud)

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


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

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

我不确定是否允许超载.

MSa*_*ers 1

该声明分为两部分,因为它讨论了(用于 C++ 实现)保留的名称(来自 C 标准)。尤其,

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

这包括C库函数abs

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

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

  • `abs` 不是函数签名,因此不能在第 1 部分中引用。 (2认同)