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++"链接的函数签名,或者作为全局命名空间中的命名空间范围的名称.
我不确定是否允许超载.
该声明分为两部分,因为它讨论了(用于 C++ 实现)保留的名称(来自 C 标准)。尤其,
第 1 部分:使用外部链接声明的 C 标准库中的每个函数签名
这包括C库函数abs
第 2 部分:保留给实现用作具有 extern“C”和 extern“C++”链接的函数签名,或用作全局命名空间中的命名空间范围的名称。
因此该名称::abs是为 C++ 实现保留的。你不能使用它。超载是无关紧要的。