给出一些声明:
template <class T, T t>
struct foo {};
template <class T>
constexpr T ident(T t) {
return t;
}
constexpr int bar() {
return 0;
}
int main(int argc, const char *argv[])
{
foo<bool, true> a;
foo<int, bar()> b;
foo<int, ident(0)> c;
foo<int (*)(), bar> d;
foo<int(*)(), ident(&bar)> e; // not accepted (gcc 4.7.2 crashes here, even)
return 0;
}
另外:有趣的是,这导致了 gcc 4.7.2 的段错误。我不得不通过我的 4.8.0 快照的 svn 构建运行它,甚至得到一条错误消息(“必须是具有外部链接的函数地址”)......
为什么第一个是好的,最后一个是不允许的——这个 constexpr 不像 case ad 吗?似乎编译器完全有能力确定ident(&bar)
正在谈论的函数,因为它可以为其他类型做到这一点。