[英]Automatic destruction of static object
為什么C ++不創建/銷毀模板類型的靜態成員。
請注意以下示例:
#include <iostream>
struct Dump {
Dump() {
std::cout << "CTOR" << std::endl;
}
~Dump() {
std::cout << "DTOR" << std::endl;
}
};
template <typename T> struct X {
static Dump dump;
};
template <typename T> Dump X<T>::dump;
struct A : X<A> {
};
int main() {
A a;
return 0;
}
我本以為在執行時我會看到字符串CTOR
后跟DTOR
。 雖然我沒有。 我在這里錯過了什么?
它與dump
是模板類型的成員有關,但這就是我得到的。
我在§14.7.1隱式實例化中找到了一些東西。
1 / [...]類模板特化的隱式實例化導致類成員函數,成員類,作用域成員枚舉, 靜態數據成員和成員的聲明的隱式實例化,而不是定義或默認參數的隱式實例化。模板。 [...]
它繼續在第二個說明中:
2 /除非已明確實例化或明確專門化類模板或成員模板的成員,否則在要求成員定義存在的上下文中引用特化時,將隱式實例化成員的特化; 特別是, 除非靜態數據成員本身以需要靜態數據成員的定義存在的方式使用 , 否則不會發生靜態數據成員 的初始化 (以及任何相關的副作用)。
因此,除非您使用它, 否則不應將其實例化 。 這不是優化,只是標准[n3092]一致性。
除非使用,否則不會實例化。 這有效:
int main()
{
A a;
(void) a.dump;
}
另外,修復編譯錯誤:
template <typename T> Dump X<T>::dump;
只有在需要時才會實例化類模板的成員; 在這種情況下,沒有任何東西引用靜態成員,因此即使類模板本身也沒有實例化。
你會發現把語句X<A>::dump;
某處將導致成員被實例化並創建和銷毀對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.