我正在试图弄清楚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显示相同的行为,所以我认为这是我误解的内容。
答案 0 :(得分:0)
显然在未显示的main
函数中,您没有实例化任何一个类。
然后编译器没有理由为类foo
生成默认构造函数。
没有它,没有代码可以实例化reported_class<foo>
。