这个问题是这一个的后续问题.
考虑以下方案:
#include <cmath>
// meaningless, only for language-lawyer purpose
void abs(void*) {}
int main(){
abs(nullptr);
}这个程序会导致未定义的行为吗?
该标准的相关部分是[extern.names]/4。
使用外部链接声明的C标准库中的每个函数签名都保留给实现,以便作为函数签名使用,包括外接"C“和extern "C++”链接、或全局命名空间中的命名空间范围名称。
我不确定是否允许超载。
发布于 2018-06-19 10:28:06
这个语句有两个部分,因为它讨论了保留的名称(来自C标准)(用于C++实现)。特别地,
第1部分:用外部链接声明的C标准库中的每个函数签名
这包括C库函数abs
第2部分:保留给实现,用于作为函数签名使用extern "C“和extern "C++”链接,或者作为全局命名空间中命名空间范围的名称使用。
因此,::abs的名称是为C++实现保留的。你不能用它。超载是无关紧要的。
发布于 2018-06-19 10:53:42
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标准库中的每个函数签名都保留给实现,以便作为函数签名使用,其中包含extern "C“和extern "C++”链接,182或全局命名空间中的命名空间范围名称。
这些建议你可以,因为只有签名才是保留的。
命名空间奖励::std
http://www.eel.is/c++draft/library#namespace.std
20.5.4.2.1.1除非另有规定,否则如果C++程序将声明或定义添加到命名空间std或命名空间std中的命名空间,则该程序的行为是未定义的。
标准总结了例外情况
https://stackoverflow.com/questions/50925440
复制相似问题