#include <iostream> template<bool = true> struct A { A() { static int x; std::cout << &x << "\n"; } }; static A<> a;
如果我有两个不同的C文件,包括这个文件怎么办 – 它会打印相同的地址两次,保证?更重要的是,如果x是一个不同类型的对象,它有一个非平凡的构造函数,那么它是否只能被运行一次?
解决方法
Each function template specialization instantiated from a template has its own copy of any static variable.
我假设(并真诚地希望)模板类的成员函数以相同的方式处理,尽管我找不到这样说的特定语言.
在任何情况下,除了在多线程上下文中初始化静态变量的通常风险外,我相信这将是正常的. A< true> :: A()(和内部的“static int A< true> :: A :: x”)将被标记为弱符号,并且在链接时将选择一个版本,与任何其他模板相同. (显然,A< false>的实例化将不同于A< true>).
编辑评论:
关于不同翻译单位的担心似乎由[3.2 / 5]部分所述,定义了ODR:
If D is a template and is defined in more than one translation unit,then… [providing the deFinitions are identical]… the program shall behave as if there were a single deFinition of D.
实际的要求是更多的语言 – 律师(在实例化的依赖名称必须相同等),但我认为这是有点让你清楚:-)
原文地址:https://www.jb51.cc/c/113004.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。