编辑:委员会已经说过static
,Clang 要求静态数据成员模板的关键字是正确的。14/1 中给出的例子是不正确的。希望工作草案的下一次修订能够消除文本中的歧义。
这
似乎是 Clang 中的一个错误,但标准草案中的措辞是模棱两可的。我相信意图是关键字
static
是隐含的。如果这不是本意,那么标准措辞可能更接近“类范围内的变量模板
必须是静态数据成员模板”。而不是“类范围内的变量模板
是静态数据成员模板”。(
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 在他的评论中所说,该部分的实际规范文本与示例相矛盾。他们将 Clang 写入标准的文本,因此该示例被诊断为格式错误。委员会知道变量模板的措辞在各个地方都需要一些帮助,所以我确信在下一个草案/C++14 中会有一些清理。