Wie ich es verstehe, geht in C ++ eine Klasse, die in der Funktionsparameterliste deklariert ist, automatisch in den umschließenden Bereich:
%Vor%entspricht:
%Vor%Welcher Abschnitt in C ++ - Standard gibt dieses Verhalten an? Was ist mit C?
Nun, ich denke, C folgt in diesem Fall nicht C ++. Visual Studio kompiliert diesen Code nicht im C-Modus:
%Vor%Dies ist ein elaborated-type-specifier . Das relevante Zitat in C ++ 14 ist:
%Vor%
[basic.lookup.elab]/2:
[...] Wenn der elaborated-type-specifier von eingeführt wird Der Klassenschlüssel und diese Suche findet keinen zuvor deklarierten Typnamen , oder wenn der elaborated-type-specifier ist erscheint in einer Deklaration mit der Form:Der elaborated-type-specifier ist eine Deklaration, die den Klassennamen wie in 3.3.2 beschrieben einführt.
Dies deklariert den Klassennamen wie folgt:
[basic.scope.pdecl]/7:
Der Deklarationspunkt einer Klasse, die zuerst in einem elaborated-type-specifier deklariert wurde, lautet wie folgt:- [...]
- für elaborated-type-specifier des Formulars
%Vor%wenn der elaborated-type-specifier in der decl-specifier-seq oder Parameterdeklarationsklausel einer Funktion verwendet wird, die im Namensraumbereich
, der Bezeichner wird als Klassenname im Namespace deklariert enthält die Deklaration; Ansonsten, außer als Friend-Deklaration, wird der Bezeichner in der kleinster Namespace oder Blockbereich, der die Deklaration enthält.
Weil struct A
ein elaborated-type-specifier ist und A
noch nicht deklariert wurde, wird A
in dem Namespace deklariert, der die Deklaration enthält (in diesem Fall die globaler Namespace).
Tags und Links c++ language-lawyer parameters