C++ 为什么不是';调用C函数时引发的编译器时间错误
根据标准在C++ 为什么不是';调用C函数时引发的编译器时间错误,c++,c,C++,C,根据标准在N4296::13.3.3[over.match.best] namespace A { extern "C" void f(int = 5); } namespace B { extern "C" void f(int = 5); } using A::f; using B::f; void use() { f(3); // OK, default argument was not used for viability f(); // Er
N4296::13.3.3[over.match.best]
namespace A
{
extern "C" void f(int = 5);
}
namespace B
{
extern "C" void f(int = 5);
}
using A::f;
using B::f;
void use()
{
f(3); // OK, default argument was not used for viability
f(); // Error: found default argument twice
}
正如标准在N4296::7.5/6[dcl.link]
中所述:
一个函数的两个声明与C语言的链接相同
函数名(忽略限定它的名称空间名)
出现在不同的命名空间范围中,引用同一函数
我试着用我自己的例子来探讨这样一件事:
#include <iostream>
namespace A
{
extern "C" void foo(int a = 5){ std::cout << a << "1" << std::endl; }
}
namespace B
{
extern "C" void foo(int a = 5);
}
using A::foo;
using B::foo;
int main()
{
foo(); //Error
foo(2);
}
#包括
名称空间A
{
extern“C”void foo(inta=5){std::cout正如评论中已经提到的,标准的示例和您的示例之间没有相关的区别。正确实现标准的编译器会对两者进行诊断
这显然是一个编译器错误,至少在clang和Intel中是这样,当您将示例编辑到荒谬的地方时,就可以看到这一事实
namespace A
{
extern "C" void f(int = 5);
}
namespace B
{
extern "C" void f(int = 3); // different default argument
}
using A::f;
using B::f;
void use()
{
f(); // No error !
}
尽管得到两个不同的默认参数,但不会生成错误或警告。使用了其中一个默认参数,第一个用于Intel,第二个用于clang
GCC确实拒绝了这个毫无意义的示例,因此没有快速简便的方法来验证它是否也是GCC中的一个bug,但这并没有改变事实:如前所述,它默默地接受了标准中的示例,其中标准指出了应该检测错误的位置。我只是好奇m是什么“C++”命名空间中的<代码>外部“C”<代码>函数。RE:“除非我在A命名空间中明确定义了函数,否则我的示例和标准的示例有什么不同?”:我只是尝试编辑你的演示,以不明确地定义函数,而且它仍然编译得很好。(链接失败了。)这不是区别。在这种情况下,g++似乎没有给出错误。嗯……顺便说一句,你的问题中遗漏了规范的一个重要部分:“如果最佳可行函数解析为找到多个声明的函数,并且如果这些声明中至少有两个声明(或者在使用声明的情况下它们引用的声明)指定了使函数可行的默认参数,则程序的格式错误。“听起来像是一个CLAG和G+缺陷?”J.J. Z. WikC:它允许你从一个库中访问函数,而不会与C++代码中其他地方使用的标识符冲突。这看起来像是一个标准错误的情况,所以实现忽略了它。(显然,除了不合规之外)。