Gdzie w deklaracji można umieścić specyfikator klasy składowania?
Na przykład rozważmystatic
specyfikator klasy pamięci. Oto kilka przykładów zarówno poprawnych, jak i źle ukształtowanych zastosowań tego specyfikatora klasy pamięci masowej:
static int a; // valid
int static b; // valid
static int* c; // valid
int static* d; // valid
int* static e; // ill-formed
static int const* f; // valid
int static const* g; // valid
int const static* h; // valid
int const* static i; // ill-formed
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
(Deklaracje oznaczone jako „ważne” zostały zaakceptowane przez Visual C ++ 2012, g ++ 4.7.2 i Clang ++ 3.1. Deklaracje oznaczone jako „źle uformowane” zostały odrzucone przez wszystkie kompilatory.)
Wydaje się to dziwne, ponieważ specyfikator klasy pamięci odnosi się do zadeklarowanej zmiennej. Jest to zadeklarowana zmiennastatic
, nie typ zadeklarowanej zmiennej. Dlaczego sąe
ii
źle uformowany, alek
jest dobrze uformowany?
Jakie są reguły regulujące prawidłowe umieszczanie specyfikatorów klasy pamięci masowej? Kiedy użyłemstatic
w tym przykładzie pytanie dotyczy wszystkich specyfikatorów klasy pamięci. Najlepiej, aby kompletna odpowiedź cytowała odpowiednie sekcje standardu językowego C ++ 11 i wyjaśniała je.