模板静态成员变量的实例化

时间:2014-01-07 03:13:08

标签: c++ templates

我正在试图弄清楚clang如何确定C ++模板静态成员变量需要实例化的内容,而且我看到一些令我困惑的行为。

给出以下代码:

#include <stdio.h>
#include <typeinfo>

int report(const char *name)
{
    printf("Reporting class: %s\n", name);
    return 0;
}

template<typename ReportedClass>
class reported_class
{
public:
    reported_class()
    {
        _reported_instances++;
    }

private:
    static int _reported_instances;
};

template<typename ReportedClass>
int reported_class<ReportedClass>::_reported_instances = report(typeid(ReportedClass).name());

class foo : reported_class<foo>
{
public:
    int baz() { return 0; }

};

class bar : reported_class<bar>
{
public:
    bar() { }
    int baz() { return 0; }
};

int main(int argc, char **argv)
{
    return 0;
}

当我运行它时,我看到以下内容:

$ c++ -v
Apple LLVM version 5.0 (clang-500.0.68) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
$ c++ test.cpp 
$ ./a.out 
Reporting class: 3bar
$

为什么报告_class的静态被实例化,而不是foo的静态?唯一的区别似乎是构造函数的存在,但我希望在任何一种情况下都会调用reported_class构造函数(因此在构造函数中使用时会强制执行静态实例化)。标准中是否存在我不知道的原因,这是否可以依赖?

gcc-4.7.3显示相同的行为,所以我认为这是我误解的内容。

1 个答案:

答案 0 :(得分:0)

显然在未显示的main函数中,您没有实例化任何一个类。

然后编译器没有理由为类foo生成默认构造函数。

没有它,没有代码可以实例化reported_class<foo>