【发布时间】:2013-04-09 08:08:32
【问题描述】:
非类型模板参数显然是不是类型的,例如:
template<int x>
void foo() { cout << x; }
在这种情况下,除了int,还有其他选项,我想参考this great answer。
现在,有一件事让我很头疼:结构。考虑:
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,因为这是不允许的。但是,我无法理解那一小行代码的真正问题。不允许使用结构作为值参数的原因是什么。如果我可以使用三个ints,为什么不使用三个整数的结构?如果它只有微不足道的特殊成员,那么它在处理上应该与只有三个变量没有什么不同。
【问题讨论】:
-
该标准只允许 int 和我认为的成员指针。您甚至不能将 double 或 float 作为非类型参数。甚至 const char* 都非常有用(并且在 VC6 上令人惊讶地工作)。从一些答案来看,不确定 C++11 是否有任何变化。
-
@Pete
const char*存在写在不同地方的相同文字之间不等式的问题,对于 double/float 也一样。此外,您跳过了参考。我的问题不是关于这是否可能(显然不是),而是为什么不是。 -
我猜可能有太多的可能性来为标准磨练任何东西。如果它仅限于 int,则更容易指定它。也许它会在 50 年后出现在下一个 C++ 标准中。
-
@Pete 您是否使用
a == b测试两个浮点变量是否相等? -
出于同样的原因没有隐式定义
operator==?