1. ホーム
  2. c++

[解決済み] constexpr externはどのように宣言するのですか?

2023-07-15 14:22:38

質問

変数 extern constexpr と宣言し、別のファイルでそれを定義することは可能ですか?

試してみましたが、コンパイラはエラーを出します。

の宣言は constexpr 変数 ' i ' は定義ではありません

は.hで定義されています。

extern constexpr int i;

を.cppに記述してください。

constexpr int i = 10; 

どのように解決するのですか?

いいえ、できません。規格ではこうなっています(7.1.5項)。

1 constexpr 指定子は、変数または変数テンプレートの定義、関数または関数テンプレートの宣言にのみ適用される。 変数や変数テンプレートの定義、関数や関数テンプレートの宣言、または 関数テンプレートの宣言、またはリテラル型の静的データメンバの宣言にのみ適用されます。 リテラル型の静的データメンバの宣言にのみ適用する(3.9)。関数,関数テンプレート,変数テンプレートの宣言のいずれかが,定数型を持つ場合 関数、関数テンプレート、変数テンプレートの宣言に constexpr 指定子がある場合、そのすべての宣言に constexpr 指定子がなければならない。 の宣言にconstexpr指定子がある場合,その宣言はすべてconstexpr指定子を含まなければならない。[注:明示的な 注:明示的な特殊化は、テンプレート宣言とconstexpr指定子に関して異なる場合がある。 注:明示的な特殊化は、constexpr指定子に関してテンプレート宣言と異なることがあります。関数パラメータを宣言することはできない。 constexpr - end note ]。

標準によって与えられたいくつかの例です。

  constexpr void square(int &x);  // OK: declaration
  constexpr int bufsz = 1024;  // OK: definition
  constexpr struct pixel {  // error: pixel is a type
    int x;
    int y;
    constexpr pixel(int);  // OK: declaration
  };

  extern constexpr int memsz; // error: not a definition