2015-07-04 10 views
18

W [namespace.udecl]/10 masz następujący przykład:Deklaracja użycia nie może być powtarzana w zakresie funkcji. Dlaczego?

namespace A { 
    int i; 
} 
namespace A1 { 
    using A::i; 
    using A::i; // OK: double declaration 
} 
void f() { 
    using A::i; 
    using A::i; // error: double declaration 
} 

Ten fragment kompiluje w brzękiem.

+1

Jaki praktyczny problem to powoduje? –

+0

@LightnessRacesinOrbit: To pytanie jest pytaniem o wybór języka. Nie powinno być żadnych praktycznych problemów z takimi pytaniami, aby były interesujące. Istnieje definicja języka programowania. – Supremum

+0

@Supremum: [_ "jeśli twoje pytanie na ogół obejmuje ... praktyczny, odpowiedzialny problem ... to jesteś w odpowiednim miejscu, aby zadać pytanie!" (Http://stackoverflow.com/help/on-topic) To może być interesujące, ale nie dotyczy tematu. –

Odpowiedz

7

Pierwsza to deklaracja wewnątrz przestrzeni nazw, a wielokrotne użycie instrukcji może się często zdarzyć przy użyciu #includes. Drugi znajduje się w definicji funkcji i nigdy byś tego nie zrobił, chyba że popełnisz błąd. Nie można na przykład dwukrotnie zdefiniować tego samego symbolu, ale można zadeklarować kilka razy.

Używanie oświadczenia to więcej niż deklaracja. Jest nieco silniejszy, ponieważ importuje funkcję z jednej przestrzeni nazw do drugiej. Na przykład może ciągnąć zabezpieczoną funkcję składową klasy podstawowej do klasy pochodnej, czyniąc ją publiczną. To prawie definicja przez powiązanie.

+0

Czy możesz podać cytat ze standardu? – Belloc

+0

Odpowiedź na to pokrewne pytanie rozwiązuje to pytanie: http://stackoverflow.com/questions/31224886/program-with-chaining-of-using-declarations-compiles-on-msvs-and-clang-but-not-o Zwróć uwagę, że przykład [namespace.udecl]/10 jest niepoprawny i właśnie został zmieniony w odpowiedzi na moje pokrewne pytanie. – Supremum

Powiązane problemy