非类型模板参数显然不是类型,例如:
template<int x>
void foo() { cout << x; }
除了这种情况,还有其他选择int
,我想参考这个很好的答案。
现在,有一件事情让我很烦恼:结构。考虑:
struct Triple { int x, y, z; };
Triple t { 1, 2, 3 };
template<Triple const& t>
class Foo { };
现在,使用正常的非类型引用语义,我们可以编写:
Foo<t> f;
这里值得注意的是t
can't beconstexpr
或 even const
,因为这意味着内部链接,这基本上意味着该行不会编译。我们可以通过声明t
as来绕过它const extern
。这本身可能有点奇怪,但真正让我想知道的是为什么这是不可能的:
Foo<Triple { 1, 2, 3 }> f;
我们从编译器中得到了一个非常不错的错误:
错误:
Triple{1, 2, 3}
不是类型的有效模板参数,const Triple&
因为它不是左值。
我们不能Triple
在模板中按值指定,因为这是不允许的。但是,我无法理解那一小行代码的真正问题。不允许使用结构作为值参数的原因是什么。如果我可以使用三个int
s,为什么不使用三个整数的结构?如果它只有微不足道的特殊成员,那么它在处理上应该与只有三个变量没有什么不同。