[英]Does static object in a template function have linkage?
这个问题涉及到我之前的问题: 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-expression,但如果名称引用函数或数组,则可以省略&;如果相应的模板参数为引用,则应省略; 要么 ...
当然,在函数中声明的静态变量(无论是否为模板函数)没有链接。
第3.5段 8:“除非另有说明,否则在块范围(3.3.3)中声明的名称没有链接”
据我所知,该子句中列出的唯一例外情况已在第5段中提供。 6:“在块作用域中声明的函数名称与在块作用域extern声明中声明的变量名称具有链接。”
但是,有可能在某个时候松开14.3.2。
DanielKrügler于2012-02-01提交了DR 1451 :
根据14.3.2 [temp.arg.nontype]第1段项目符号3,只有具有链接的对象才能用于形成非类型模板参数。 是否仍然需要此限制? 使用块范围对象作为模板参数会很方便。
已关闭DR,因为它是扩展请求,应由Evolution工作组处理。 它似乎已包含在n3413 “为非类型模板参数允许任意文字类型”中。
因此,可以肯定的是,一个或多个C ++编译器可能选择对非类型模板参数实施更宽松的限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.