С++ 11: ссылка на-void?

Является ли эта программа С++ 11 плохо сформированной?

typedef void& rv;

int main() {}

Я не мог найти что-либо, запрещающее его в стандарте (см. пункты 3.9.2 и 8.3.2).

Clang говорит: "Невозможно создать ссылку на" void ", gcc говорит:" Нельзя объявить ссылку на "void"

Я бы ожидал, что [dcl.ref]/5 даст такое ограничение, если оно предназначено.

Являются ли реализации просто "чтениями между строками", потому что такой тип никогда не может использоваться в определении объекта?

Ответы

Ответ 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.

Ответ 2

Ссылка на void означает данные, на которые указывает, у которых нет типа, поэтому на него нельзя ссылаться каким-либо значимым образом.

Ссылка - это ссылка на экземпляр некоторого типа, который не может иметь тип void.