я пытался передать, объявить constexpr
переменную шаблон:вперед объявить constexpr переменную шаблона
template<typename>
constexpr std::size_t iterator_category_value;
Цель состояла в том, чтобы документально подтвердить, что каждая специализация должна быть constexpr
, но я должен признать, что я никогда не проверял ли это было законно или нет, и g ++ был доволен этим. Однако, когда я пытался скомпилировать этот Спиннет с лязгом ++ вместо этого, я получил следующее сообщение об ошибке:
error: default initialization of an object of const type 'const std::size_t' (aka 'const unsigned long') constexpr std::size_t iterator_category_value; ^ = 0
Ошибка имеет смысл, и удаление constexpr
делает его исчезнуть, так что это не проблема. Тем не менее, мне сейчас интересно: позволяет ли стандарт разрешать такое объявление constexpr
для шаблона переменной или он является незаконным? g ++ и clang ++, похоже, не согласны, и я хотел бы знать, где я должен предоставить отчет об ошибке, если это необходимо.
Оба они жалуются на переменную constepxr
с переадресацией, которая не является шаблоном переменной, поэтому контекст шаблона переменных, по-видимому, является тем, что делает компиляторы несогласными.
Текст http://wg21.cmeerw.net/cwg/issue1712 подразумевает, что вы не можете переадресовать его как 'constexpr', однако я не совсем уверен, как std запрещает его. Шаблон переменной не выглядит как объявление объекта * для меня. – dyp
OTOH, [dcl.dcl] p9 кажется очень общим и должен применяться к переменным шаблонам (=> шаблоны переменных - объявления объектов => 'constexpr' требует инициализации) – dyp
@dyp Кстати, что вы подразумеваете под« сейчас »? Разве вы не компилируете самые современные источники, доступные в настоящее время в Git? – Columbo