Lig*_*ica 45 c++ language-lawyer c++11 c++14 bsearch
继我对这个问题的回答之后,在C++ 11和C++ 14中:
[C++11, C++14: 25.5/2]:内容与标准C库头相同<stdlib.h>,但以下情况除外:
[C++11, C++14: 25.5/3]:功能签名:Run Code Online (Sandbox Code Playgroud)bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));被两个声明取代:
Run Code Online (Sandbox Code Playgroud)extern "C" void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); extern "C++" void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));两者都具有与原始声明相同的行为.
然而,
[C++11, C++14: 7.5/5]:如果两个声明声明具有相同名称的函数,并且参数类型列表(8.3.5)是同一命名空间的成员,或者声明具有相同名称的对象是同一命名空间的成员,并且声明为这些名称提供不同的语言链接,该计划是不正常的; 如果声明出现在不同的翻译单元中,则无需诊断.[..]
这是一个缺陷吗?
Rei*_*ica 49
但参数类型列表不一样.在一个中,compar是指向具有"C"语言链接的函数的指针,在另一个中,它是指向具有"C++"语言链接的函数的指针.
C++ 11,7.5规定:
1 ...具有不同语言联系的两种函数类型是不同的类型,即使它们在其他方面是相同的.
4在链接规范中,指定的语言链接适用于所有函数声明符的函数类型,具有外部链接的函数名称,以及在链接规范中声明的具有外部链接的变量名称.[ 例如:
Run Code Online (Sandbox Code Playgroud)extern "C" void f1(void(*pf)(int)); // the name f1 and its function type have C language // linkage; pf is a pointer to a C function
当实现1讨论函数类型时, 7.5/1和7.5/5之间看似不一致,而5解决函数名称.
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |