繁体   English   中英

模板函数中的静态对象是否具有链接?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM