constexpr 指定元 (C++11)

附註: IBM 在批准之前支援 C++11的選定特性,稱為 C++0x 。 IBM 將繼續開發並實作此標準的特性。 語言層次的實作是以 IBM的標準解譯為基礎。 在 IBM的所有 C++11 特性實作完成 (包括支援新的 C++11 標準程式庫) 之前,實作可能會在不同版本之間變更。 IBM 不會嘗試維護程式碼、二進位或清單及其他編譯器介面中的相容性,以及舊版 IBM的新 C++11 特性實作。

C++11 標準引進新的關鍵字constexpr作為宣告指定元。 您可以套用constexpr僅針對下列環境定義指定的指定元:

  • 變數的定義
  • 函數或函數範本的宣告
  • 靜態資料成員的宣告

例如:

constexpr int i = 1;       // OK, definition
constexpr extern int j;    // Error, not a definition
constexpr int f1();        // OK, function declaration, but must be defined before use

如果您宣告的函數不是具有的建構子constexpr指定元,該函數是constexpr功能。 同樣地,如果您使用constexpr指定元,該建構子是constexpr建構子。 兩者constexpr功能及constexpr建構子隱含在行內。 例如:

struct S {
  constexpr S(int i) : mem(i) { }   // OK, declaration of a constexpr constructor
  private:
    int mem;
};
constexpr S s(55);      // OK, invocation of a constexpr constructor

如果指定了函數或函數範本的任何宣告constexpr,其所有宣告必須包含constexpr指定元。 例如:

constexpr int f1();         // OK, function declaration
int f1() {                  // Error, the constexpr specifier is missing
  return 55;
}     

無法使用來宣告函數參數constexpr指定元。 下列範例示範:

constexpt int f4(constexpr int);      //Error

Aconstexpr物件宣告中使用的指定元將物件宣告為const. 這類物件必須是文字類型且已起始設定。 如果由建構子呼叫起始設定,則該呼叫必須是常數表示式。 否則,如果constexpr在參照宣告中使用指定元,其起始設定元中出現的每一個完整表示式都必須是常數表示式。 轉換起始設定表示式所使用的每一個隱含轉換,以及用於起始設定的每一個建構子呼叫,在常數表示式中必須是有效的。 例如:

constexpr int var;         // Error, var is not initialized
constexpr int var1 = 1;  // OK

void func() {
  var1 = 5;   //Error, var1 is const
}

struct L {
  constexpr L() : mem(55) { }
  constexpr L(double d) : mem((int)d) { }
  L(int i) : mem(i) { }
  operator int() { return mem; }
private:
  int mem;
};

// Error, initializer involves a non-constexpr constructor.
constexpr L var2(55);   

double var3 = 55;

// Error, initializer involves a constexpr constructor with non-constant argument
constexpr L var4(var3);   

// Error, involves conversion that uses a non-constexpr conversion function
constexpr int var5 = L();  

Aconstexpr非建構子之非靜態成員函數的指定元宣告成員函數為const這類的constexpr成員函數必須是文字類型。 在下列範例中,類別NL是非文字類型,因為它具有使用者提供的解構子。

struct NL {
  constexpr int f(){       //error, enclosing class is not a literal type
     return 55;
  }       
  ~NL() { }
};

呼叫constexpr函數會產生相同的結果,作為對對等非constexpr函數,除了呼叫constexpr函數可以出現在常數表示式中。

Themain無法以constexpr指定元。