保留的函数名称可以重载吗?
Can reserved function names be overloaded?
这个问题是这个问题的后续问题。
请考虑以下程序:
#include <cmath>
// meaningless, only for language-lawyer purpose
void abs(void*) {}
int main(){
abs(nullptr);
}
此程序是否会导致未定义的行为?
标准中的相关部分是 [extern.names]/4:
使用外部链接声明的 C 标准库中的每个函数签名都保留给实现,以用作具有外部"C"和外部"C++"链接的函数签名,或用作全局命名空间中命名空间范围的名称。
我不确定是否允许重载。
这个语句有两个部分,因为它谈论的是保留的名称(来自 C 标准((用于C++实现(。特别
第 1 部分:声明的 C 标准库中的每个函数签名 带外部链接
这包括 C 库函数abs
第 2 部分:保留给实现以用作函数 同时具有外部"C"和外部"C++"链接的签名,或作为名称 全局命名空间中的命名空间范围。
因此,名称::abs
是为C++实现保留的。你不能使用它。重载无关紧要。
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标准库中的每个函数签名都保留给实现,以用作具有外部"C"和外部"C++"链接的函数签名,182或作为全局命名空间中命名空间范围的名称。
这些建议你可以,因为它只是保留的签名。
命名空间的奖励 ::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 总结了例外情况
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?