簡體   English   中英

為什么本地類中不允許使用靜態數據成員?

[英]Why aren't static data members allowed in local classes?

本地類中不能存在static const成員的原因是什么? 這似乎是一個相當愚蠢的限制。

例子:

void foo() {
  struct bar {
    int baz() { return 0; }   // allowed
    static const int qux = 0; // not allowed?!?
  };
}

struct non_local_bar {
  int baz() { return 0; }   // allowed
  static const int qux = 0; // allowed
};

引用標准(9.8.4):

本地類不應具有靜態數據成員。

來自標准第 9.4.2 節:

如果靜態數據成員是 const 整型或 const 枚舉類型,則它在類定義中的聲明可以指定一個常量初始化器,它應該是一個整型常量表達式。 在這種情況下,該成員可以出現在其范圍內的整數常量表達式中。 如果在程序中使用該成員,則該成員仍應在名稱空間范圍內定義,並且名稱空間范圍定義不應包含初始化程序。

基本上,本地類沒有鏈接,靜態數據成員需要鏈接。

由於無法在命名空間范圍內定義本地類的靜態數據成員(帶有初始化程序的聲明不是定義),因此不允許使用它們,無論它們是否為 const 整型。 從表面上看,編譯器似乎應該能夠內聯該值,但是如果您嘗試訪問指向該成員的指針會發生什么? 使用命名空間范圍的類,您只會收到鏈接器錯誤,但本地類沒有鏈接。

我猜從理論上講,只要它們僅用於整型常量表達式,它們就可以允許您在本地類中使用靜態常量整數類型,但這可能會給標准機構和編譯器供應商帶來太多的負擔來區分實用價值很小; 本地靜態變量可以從本地類訪問,因此使用本地靜態常量應該同樣好。

我不認為有一個。原因。 不允許使用普通靜態數據成員,因為在聲明后無法定義它們。

也不要忘記你可以在.class 之外創建一個局部const 變量,你可以在類內部使用它,只要你只讀取它的值(也就是說,只要你不取.its.address)。

類的靜態成員需要在全局范圍內定義,例如

  abc.h

   class myClass {
   static int number;
  };
     abc.cpp

   int myClass::number = 314;

現在,由於 void abc(int x) 內的作用域不是全局的,因此沒有定義靜態成員的作用域。

隨着事情的進展,我們現在有了 C++11,你可以在你的類中定義整數常量變量成員。

class test
{
public:
    const int FOO = 123;

    [...snip...]
};

當您使用 C++11 編譯時,這有效。 請注意,未使用static關鍵字。 在打開優化的情況下進行編譯時,這些變量可能都會被優化掉。 但是,在調試中,它們作為常規變量成員出現在您的結構中。

但是請注意,類/結構的大小仍將包括該變量。 所以這里的變量 FOO 可能是 4 個字節。

但是,在大多數情況下,函數中定義的類將完全優化掉,因此這是一種很好的處理方式(我的 50% 的類都有這樣的變量成員!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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