C++中如果一個模板函數沒有使用過,那么其局部靜態變量都不會被實例化:
class A {
public:A() {edward::print("A ctor");}
};template<typename T>
void test() {static A a;
}int main() {test<int>(); //如果注釋掉則不會有輸出return 0;
}
A ctor
如果不顯示地調用test
函數,局部靜態變量a是不會被實例化的。
同樣的,如果一個靜態類沒有被實例化,那么他的成員也不會被實例化,就算這個靜態類實例化了,但是沒有使用一些靜態變量、方法,那么這些沒有使用的東西是不會被實例化的。注意:成員變量在模板類實例化后無論是否使用都存在。
class A {
public:A() {edward::print("A ctor");}
};template<typename T>
class Test {
public:static A a;A aa;
};template<typename T>
A Test<T>::a;int main() {Test<int> test;
// test.a; //如果取消注釋會多打印一條語句 return 0;
}
A ctor
通過觀察注釋的語句,我們發現模板類的靜態變量a如果沒有被使用,那么即使模板類實例化也不存在(具體來說就是不分配內存,不調用構造函數)。
至于靜態方法和成員方法更是如此了,在《C++ Primer》第五版 16.1.2 類模板-類模板成員函數的實例化這部分提到:如果一個成員函數沒有被使用,那么它不會被實例化。