Declarators. Да, деклараторы. Они являются источником множества дискуссий по кодированию. Это действительно хорошая тема для аргументов - С++ не определяет, какой из них лучше другого (это неважно!). И поэтому мы можем написать их, не беспокоясь о том, что кто-то может высмеять вас:
int x;
int& a = x;
int &b = x;
int* c = &x;
int *d = &x;
В синтаксических терминах b
и d
являются "более достоверными", чем остальные. Мы должны указать модификаторы декларатора перед именами:
int m, *n; // m is an int; n is a pointer to int
Но поток, похоже, обратился в пользу одного. С помощью вариативных шаблонов С++ 11 положение деклараторов, по-видимому, ограничено формой, в которой модификаторы ближе к базовому типу:
template<typename... Ts>
void VariadicFuncRef(const Ts&... args) { }
^
template<typename... Ts>
void VariadicFuncPtr(Ts*... args) { }
^
Ошибка записи этих форм:
template<typename... Ts>
void VariadicFuncRef(const Ts... &args) { }
template<typename... Ts>
void VariadicFuncPtr(Ts... *args) { }
Для конкретного примера нажмите здесь.
Итак, мой вопрос таков: Почему мы ограничиваемся этой (юридической) формой и не можем использовать другую?
Любые мысли ребята?
ДОПОЛНИТЕЛЬНЫЙ 1: Меня также интересует дизайнерское решение о том, почему это "правило" "принудительно".