我认为以下程序格式正确:
#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
是指一组 重载函数的任何成员是函数模板,如果 接下来是<
,<
始终作为a的分隔符template-argument-list
而不是小于运营商。什么时候 在解析template-argument-list
时,会采用第一个非嵌套>
作为结束分隔符而不是大于运算符。
在该示例中,我们可以看到<
表达式中的第一个foo<a<b>()
被视为模板参数的起点。模板参数最多为第一个>
,因此a<b
应被视为参数。但事实并非如此,这有什么不对?
答案 0 :(得分:7)
是的,只要表达式是编译时常量表达式,这是可能的。
您需要做的就是让int
成为constexpr
。您可能希望为代码的人类读者在表达式周围添加括号(编译器在正确解析foo<a<b>
时没有问题,而人类会认为最后缺少>
:
constexpr int a = 4;
constexpr int b = 5;
int main(){ foo<(a<b)>(); return 0;}
答案 1 :(得分:2)
a<b
和a
都是编译时常量时, b
才是编译时常量。
这对我有用:
#include <iostream>
template <bool>
void foo(){ };
const int a = 4;
const int b = 5;
int main(){ foo<a<b>();}