Ответ 1
Цитата из стандарта С++ 11 (акцент мой):
8.3.2 Ссылки
1 [...] Объявление, которое указывает тип " ссылка на cv void" плохо сформирована.
В качестве побочного средства информации это правило было использовано в предложении N3421 greater<>
(которое уже было принято для включения в будущий C + +14), используя void
в качестве аргумента шаблона по умолчанию.
В. Методика использования аргументов шаблона по умолчанию и явных специализации для
void
были выбраны для его неинтрузивности.greater<void>
недействителен С++ 11 (он попытается сформировать ссылку наvoid
, запрещенную 8.3.2 [dcl.ref]/1). Кроме того, пока пользователям разрешено специализироваться Стандартное библиотечное оборудование (17.6.4.2.1 [namespace.std]/1), такие специализации должен включать пользовательские типы.
Возможно, я просто немного потворствую этим играм ума, но для обоснования того, почему это правило соблюдено, и я должен сказать, что это только мое собственное скромное мнение - рассмотрите следующий код:
sizeof(double&); // Results in double size
using foo_ref = foo&;
sizeof(foo_ref); // Results in foo size
sizeof(void); // Error! void has no size!
sizeof(void&); // Error! Tries to get the size of void
Самое главное, имейте в виду, что ссылки - это просто псевдонимы других объектов, и вы не можете иметь объект типа void
.