Deklaratory. Tak, deklaratorzy. Są źródłem wielu debat poświęconych konwencjom kodowania. To naprawdę dobry temat na argumenty - C++ nie rządzi tym, który jest lepszy od drugiego (to nie obchodzi!). A więc możemy napisać to bez obaw może wyśmiać kogoś z was:Declarator pozycja modyfikatora w szablonach variadic
int x;
int& a = x;
int &b = x;
int* c = &x;
int *d = &x;
Pod względem składniowym, b
i d
są „bardziej poprawny” niż inni. Wymagane jest umieszczenie modyfikatorów deklaratora przed nazwami:
int m, *n; // m is an int; n is a pointer to int
Ale wydaje się, że fala przemawia na korzyść jednego. Z C++ 11 w zmiennej liczbie argumentów szablonów, pozycja declarators wydaje się być ograniczone do formularza gdzie modyfikatory są bliżej Typ podstawy:
template<typename... Ts>
void VariadicFuncRef(const Ts&... args) { }
^
template<typename... Ts>
void VariadicFuncPtr(Ts*... args) { }
^
Jest błędem napisać te formy:
template<typename... Ts>
void VariadicFuncRef(const Ts... &args) { }
template<typename... Ts>
void VariadicFuncPtr(Ts... *args) { }
Dla konkretnego przykładu kliknij here.
Moje pytanie brzmi: Dlaczego ograniczamy się do tej (prawnej) formy i nie możemy używać drugiej?
Jakieś myśli?
ADDITIONAL 1: Jestem również zainteresowany decyzją projektową o tym, dlaczego ta "reguła" jest "egzekwowana".
+1. Przy okazji, dobre pytanie. – Nawaz
@Nawaz Przyszło mi do głowy, kiedy spędziłem kilka minut próbując skompilować kod z niewłaściwą składnią. Lekcja: nigdy nie korzystaj z funkcji, z którymi nie jesteś dobrze przyzwyczajony. –
To przywróci twój świat: trzy ... są również częścią deklaratora! –