Ben*_*ler 7 c++ static templates
在以下程序中打印"Here":
#include <iostream>
class Base
{
static bool temp;
static bool initTemp()
{std::cout<<"Here\n";return true;}
};
bool Base::temp = Base::initTemp();
class Derived : public Base
{};
int main() {int a;std::cin>>a;}
Run Code Online (Sandbox Code Playgroud)
在以下程序中,"此处"未打印:
#include <iostream>
template <class T>
class Base
{
static bool temp;
static bool initTemp()
{std::cout<<"Here\n";return true;}
};
template <class T>
bool Base<T>::temp = Base<T>::initTemp();
class Derived : public Base<int>
{};
int main() {int a;std::cin>>a;}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,Base都不会被引用.唯一的区别是在第二种情况下它是一个模板类.谁能向我解释为什么会出现这种情况.我正在使用VS 2012.
在这两种情况下,Base都不会被引用.
这正是您没有看到任何打印到标准输出的原因.
除非使用该数据成员,否则不会实例化类模板的静态数据成员的定义; 与成员函数一样,类模板的静态数据成员的定义也是按需实例化的.
这在C++ 11标准的第14.7.1/1节中规定:
[...]类模板特化的隐式实例化会导致类成员函数,成员类,作用域成员枚举,静态数据成员和成员模板的声明的隐式实例化,而不是定义或默认参数的隐式实例化.[...]
由于您的客户端代码从未引用过Base<>::temp,因此无需构造和初始化它.
作为旁注,这个签名:
void main()
Run Code Online (Sandbox Code Playgroud)
是无效的(标准)C++.如果要编写可移植代码,则返回类型main()应始终为int.
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |