'static void' как спецификатор decl

Следующий код отлично компилируется с clang. Я хотел знать, соответствует ли это стандарту С++.

class A {
  static void x; // #1
  static const void x; // #2
  static volatile void x; // #3
};

На мой взгляд, ни одна из деклараций недействительна. В стандартном пакете проверки C++ perenial есть один такой тест (№1), и clang (v3.4) не работает тот.

Хотя, если я удалю статику из # 1, тогда clang сообщит об ошибке, как и ожидалось.

Я просмотрел стандарт и нашел один параграф о статических членах данных (9.4.2-2), в котором говорится:

2 Объявление статического члена данных в определении его класса не является определением и может иметь неполный тип, отличный от типа void с указанием cv. ...

Насколько я понимаю, эта строка дисквалифицирует № 2 и № 3 как недействительные, но не уверен в № 1. Есть ли какие-либо дополнительные детали, связанные с объявлением статического класса хранения, которые должны исключить № 1?

Спасибо,


person A. K.    schedule 02.07.2013    source источник
comment
это расширение clang. Я почти уверен, что читал коммит об этом в прошлом.   -  person Johannes Schaub - litb    schedule 02.07.2013
comment
Это возможно. В каком контексте это расширение может быть полезным?   -  person A. K.    schedule 03.07.2013
comment
Я предполагаю, что если вы создаете экземпляр template<class T> class с переменной-членом T x, может быть полезно не ломать if T = void сразу.   -  person Andrew Tomazos    schedule 03.07.2013
comment
На самом деле я даже не уверен, что разрешение void быть полным (одноэлементным) типом было бы проблемой, возможно, sizeof(void), new void или различные правила void* как-то вас укусят.   -  person Andrew Tomazos    schedule 03.07.2013
comment
Но когда шаблона нет, допускать такой синтаксис нехорошо.   -  person A. K.    schedule 03.07.2013


Ответы (1)


Нет, это запрещено, именно из-за цитируемого вами абзаца. Обратите внимание, что термин «квалифицированный резюме» в абзаце, который вы цитируете, включает в себя отсутствие квалификации. Согласно параграфу 3.9.3/10 стандарта С++ 11:

В настоящем стандарте обозначение cv (или cv1, cv2 и т. д.), используемое в описании типов, представляет произвольный набор cv-квалификаторов, т. е. один из {const}, {volatile}, {const, volatile }, или пустой набор.

person Andy Prowl    schedule 02.07.2013
comment
Спасибо за такой быстрый ответ. Теперь мне интересно, насколько сложно это исправить в clang. Или я должен ждать, пока это будет исправлено. - person A. K.; 02.07.2013
comment
@AdityaKumar: К сожалению, я не знаю - я никогда не пытался копаться в исходном коде Clang :( - person Andy Prowl; 02.07.2013
comment
В любом случае, большое спасибо за ответ. - person A. K.; 02.07.2013
comment
@AdityaKumar: Нет проблем, рад, что помогло :) - person Andy Prowl; 02.07.2013