Według przykładu której norma przewiduje w N4296::13.3.3 [over.match.best]
Dlaczego kompilator nie jest błąd czas rzucony kiedy zadzwonić do funkcji C
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
}
jako standard mówi w N4296::7.5/6 [dcl.link]
:
dwie deklaracje dla funkcji z łączeniem w języku C o tej samej nazwie funkcji (ignorując nazwy przestrzeni nazw, które ją kwalifikują), że pojawiają się w różnych zakresach przestrzeni nazw, odnoszą się do tej samej funkcji.
próbowałem zbadać coś takiego na własnym przykładzie:
#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);
}
Więc dlaczego mój przykład działa? Jakie są różnice między moim przykładem a przykładem Standardu, chyba że zdefiniowałem funkcję jawnie w przestrzeni nazw A
? Dlaczego to takie ważne?
Po prostu ciekawi mnie, co jest znaczeniem "extern" C "' funkcji w przestrzeni nazw C++. –
Odp: "Jakie są różnice między moim przykładem a przykładem Standardu, chyba że zdefiniowałem funkcję jawnie w przestrzeni nazw A?": Po prostu próbowałem edytować twoje demo, aby * nie * zdefiniować funkcję jawnie i nadal było dobrze skompilowane. (Łączenie nie powiodło się, oczywiście.) Więc to nie ma znaczenia. Wydaje się, że g ++ po prostu nie daje błędu w tej sytuacji. – ruakh
[Clang też to akceptuje] (http://coliru.stacked-crooked.com/a/2c544e25d8dcdac8). Hmm ... Btw, ważna część specyfikacji brakuje w pytaniu: * "Jeśli najlepsza możliwa do zastosowania funkcja rozwiązuje funkcję, dla której znaleziono wiele deklaracji, i jeśli co najmniej dwa z tych deklaracji - lub deklaracje, do których się odnoszą w przypadku użycia deklaracji - określ domyślny argument, który sprawił, że funkcja była użyteczna, program jest źle sformułowany. "* Brzmi jak wada Clang i g ++? – cdhowie