这个问题是指我之前的问题:clang 不编译我的代码,但是 g++ 可以。根据我的研究,问题归结为链接,静态变量data
在下面的示例中是否具有链接(它与 编译g++-4.8.1
)?它怎么有链接(否则我将无法使用非类型模板参数实例化)?
template <int const* ptr>
void foo()
{
}
typedef void (*func_type)();
template <int = 0>
void run_me()
{
static int data;
func_type const f1 = foo<&data>;
// auto f2 = foo<&data>; // doesn't work with gcc
// foo<&data>(); // doesn't work with gcc
}
int main(int, char*[])
{
run_me();
return 0;
}
标准的强制性报价:
非类型、非模板模板参数的模板参数应为以下之一: ...
— 一个常量表达式 (5.19),它指定具有静态存储持续时间和外部或内部链接的对象或具有外部或内部链接的函数的地址,包括函数模板和函数模板 ID,但不包括非静态类成员,表示为 (忽略括号)作为 & id 表达式,但如果名称引用函数或数组,则 & 可以省略,如果相应的模板参数是引用,则应省略;或者 ...