EDIT: committee has spoken, Clang верно, если требуется ключевое слово static
для статических шаблонов элементов данных. Примеры, приведенные в 14/1, равны , а не. Надеемся, что следующий пересмотр рабочего проекта устранит двусмысленность из текста.
Это
кажется быть ошибка в Clang, но формулировка в проекте стандарта неоднозначно. Я считаю, что намерение заключается в том, что ключевое слово
static
неявно. Если это не было намерение, предположительно стандартная формулировка была бы более похожей на строку «Шаблон переменной в классе scope
должен быть шаблон статических данных». вместо «Шаблон переменной в классе scope
: шаблон статических данных». (
N3797 §14/1) (по общему признанию ненормативный) пример, приведенный в §14/1 объявляет три переменных шаблоны членов класса, ни один с ключевым словом:
static
struct matrix_constants {
template<class T>
using pauli = hermitian_matrix<T, 2>;
template<class T>
constexpr pauli<T> sigma1 = { { 0, 1 }, { 1, 0 } };
template<class T>
constexpr pauli<T> sigma2 = { { 0, -1i }, { 1i, 0 } };
template<class T>
constexpr pauli<T> sigma3 = { { 1, 0 }, { -1, 0 } };
};
Примером в 14.5.1.3 статических данных члены шаблонов классов [temp.static]/1 особенно делает использование static
:
struct limits {
template<class T>
static const T min; // declaration
};
template<class T>
const T limits::min = { }; // definition
так, по крайней мере, это не запрещено делать это.
Как @RichardSmith states in his comment, фактический нормативный текст раздела противоречит примеру. Они пишут Кланг в текст стандарта, поэтому пример диагностирован как плохо сформированный. The committee is aware that the wording for variable templates needs some help in various places, поэтому я уверен, что в следующем проекте/C++ 14 будет проведена очистка.
Это необходимо? Как популярный отказ от ответственности, «это ранний проект. Известно, что он неполный и интрект, и у него много плохого форматирования. «Я не уверен, что нам нужен один вопрос/ответ для каждой ошибки в предложениях и проектах. –