【发布时间】:2021-02-17 15:11:37
【问题描述】:
考虑以下模板:
using IntFnPtr = int(*)(int);
template <IntFnPtr> void f() { }
还有这些测试:
int g(int) { }
int main()
{
f<&g>(); // OK
const IntFnPtr cp = &g;
f<cp>(); // Error -- why?
constexpr IntFnPtr cexprp = &g;
f<cexprp>(); // OK
}
为什么尝试用 cp 不正确地实例化 f? 编译器抱怨:
> error: no matching function for call to 'f'
请注意,这似乎与其他实体不一致,例如整数:
template <int> void f() { }
int main()
{
f<5>(); // OK
const int ci = 5;
f<ci>(); // OK
constexpr int cexpri = 5;
f<cexpri>(); // OK
}
【问题讨论】:
-
“这似乎与其他实体不一致,例如整数”是倒退的。整数与其他所有内容不一致。
-
我不知道你把NTTP缩写成什么。
-
@BenVoigt 非类型模板参数。但忽略这一点,它似乎只适用于完全空的类型。
-
实际上,clang 在这种情况下给出了一个非常有用的诊断:“
f<cp>()不起作用,因为它不是具有外部链接的函数的地址”。 gcc 什么也没说 :( -
@user4581301 至少在那些日子里,我从没想过编译器会帮我很多。现在它们变得更好了,如果它们没有帮助,我会更加失望:p
标签: c++ c++11 language-lawyer constexpr constant-expression