簡體   English   中英

自動銷毀靜態對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM