非类型模板参数显然不是类型,例如:
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
不能是 constexpr
或者 const
,因为这意味着它具有内部链接,这基本上意味着该行代码将无法编译。我们可以通过将 t
声明为 const extern
来绕过这个问题。这本身可能有点奇怪,但真正让我想知道的是为什么不可能做到这一点:
Foo<Triple { 1, 2, 3 }> f;
我们从编译器得到了一个相当不错的错误信息:
错误:因为它不是左值,所以
Triple{1,2,3}
不是const Triple&
类型的有效模板参数。
我们不能按值指定Triple
模板,因为这是不允许的。然而,我无法理解这个小代码行背后的真实问题。为什么不允许使用结构体作为值参数?如果我可以使用三个int
,那么为什么不能使用三个int
的结构体?如果它只有平凡的特殊成员,那么与仅使用三个变量相比,它应该没有太大的区别。
a == b
来测试两个浮点变量是否相等吗? - Bartek Banachewiczoperator==
吗? - curiousguy