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

时间:2018-06-19 09:54:16

标签: c++ language-lawyer c++-standard-library reserved-words

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

考虑以下计划:

#include <cmath>

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

int main(){
    abs(nullptr);
}

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

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

  

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

我不确定是否允许超载。

2 个答案:

答案 0 :(得分:1)

本声明分为两部分,因为它讨论了保留的名称(来自C标准)(对于C ++实现)。特别是,

  

第1部分:声明了C标准库中的每个函数签名   与外部联系

这包括C库函数abs

  

第2部分:保留给实现以用作函数   签名与extern&#34; C&#34;和extern&#34; C ++&#34;联系或作为名称   全局命名空间中的命名空间范围。

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

答案 1 :(得分:0)

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或作为名称全局命名空间中的命名空间范围。

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

namespace :: 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总结了例外情况