Следующий код отлично компилируется с 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?
Спасибо,
template<class T> class
с переменной-членомT x
, может быть полезно не ломать ifT = void
сразу. - person Andrew Tomazos   schedule 03.07.2013void
быть полным (одноэлементным) типом было бы проблемой, возможно,sizeof(void)
,new void
или различные правилаvoid*
как-то вас укусят. - person Andrew Tomazos   schedule 03.07.2013