【发布时间】:2015-02-04 16:47:52
【问题描述】:
我认为以下程序格式正确:
#include <iostream>
template <bool>
void foo(){ };
int a = 4;
int b = 5;
int main(){ foo<a<b>(); }
我这么想的原因是 (N4296::14.2/3 [temp.names]):
在名称查找 (3.4) 后发现名称是
template-name或operator-function-id或literal operator-id指的是一组 任何成员都是函数模板的重载函数,如果 这后面跟着一个<,<总是作为一个分隔符template-argument-list并且永远不会作为小于运算符。什么时候 解析一个template-argument-list,取第一个非嵌套的>作为结束分隔符而不是大于运算符。
在该示例中,我们可以看到foo<a<b>() 表达式中的第一个< 被视为模板参数的起点。模板参数到第一个>,所以a<b 应该被认为只是一个参数。但不是,怎么了?
【问题讨论】:
-
bool n=(a<b); foo<n>();? -
@ForceBru 问题不在于如何修复要工作的代码,而在于理解为什么一个代码不工作。
-
或者只是
foo<(a<b)>();,但我认为OP正在询问他尝试的语法是不允许的规则。这与解析vector<vector<int>>之类的内容有关,但我不知道确切的规则。 -
@Wintermute coliru.stacked-crooked.com/a/9bcbdb4c7354766d
-
啊。是的,正如许多人现在已经注意到的那样,这些根本不是编译时常量,因此不能用作模板参数。我第一次没有注意到。