one-definition-rule是否强制创建单个静态函数变量?

orl*_*rlp 10 c++ templates static-variables one-definition-rule

例如,请考虑以下标题:

#include <iostream>

template<bool = true>
struct A {
    A() {
        static int x;
        std::cout << &x << "\n";
    }
};

static A<> a;
Run Code Online (Sandbox Code Playgroud)

如果我有两个不同的C++文件,包括这个文件,它会打印两次相同的地址,保证怎么办?更重要的是,如果x是具有非平凡构造函数的不同类型的对象,是否可以保证只运行一次?

Tri*_*dle 6

标准[C++ 11 14.8/2]说

从模板实例化的每个函数模板特化都有自己的任何静态变量的副本.

我假设(并且真诚地希望)模板类的成员函数以相同的方式处理,尽管我找不到这样说的特定语言.

在任何情况下,除了在多线程上下文中初始化静态变量相关的常见风险之外,我确信这样可以.A<true>::A()(并且内部" static int A<true>::A::x")将被标记为弱符号,并且在链接时将挑选一个版本,与任何其他模板相同.(显然,实例化A<false>将与...截然不同A<true>.)

编辑评论:

关于不同翻译单位的担忧似乎由[3.2/5]部分涵盖,定义了ODR:

如果D是模板并且在多个翻译单元中定义,那么...... [提供的定义是相同的] ......程序应该表现得好像有一个单独的D定义.

实际的要求是更多的语言 - 律师(实例化时的依赖名称必须相同,等等),但我认为这是让你明白的一点:-)