首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保留的函数名可以重载吗?

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

Stack Overflow用户
提问于 2018-06-19 09:54:16
回答 2查看 317关注 0票数 8

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

考虑以下方案:

代码语言:javascript
复制
#include <cmath>

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

int main(){
    abs(nullptr);
}

这个程序会导致未定义的行为吗?

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

使用外部链接声明的C标准库中的每个函数签名都保留给实现,以便作为函数签名使用,包括外接"C“和extern "C++”链接、或全局命名空间中的命名空间范围名称。

我不确定是否允许超载。

EN

回答 2

Stack Overflow用户

发布于 2018-06-19 10:28:06

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

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

这包括C库函数abs

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

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

票数 1
EN

Stack Overflow用户

发布于 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中的命名空间,则该程序的行为是未定义的。

标准总结了例外情况

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50925440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档