web-dev-qa-db-ja.com

constexprと静的constexprグローバル変数の違い

C++ 11標準で、ヘッダーで定義されている場合のconstexprstatic constexprグローバル変数の違いは何ですか?より具体的には、複数の翻訳単位に同じヘッダーが含まれる場合、どの宣言(存在する場合)が翻訳単位全体で同じ変数を定義することが保証されますか?

例えば。、

cexpr.h:

#ifndef CEXPR_H
#define CEXPR_H

constexpr int cint = 1;
static constexpr int scint = 1;

#endif

a.cpp:

#include "cexpr.h"

b.cpp:

#include "cexpr.h"
18
Danra

現在の例では違いはありません。変数宣言では、constexprconstを意味し、名前空間スコープのconst変数はデフォルトで内部リンケージを持っています(したがって、staticを追加しても何かを変更します)。

C++ 14では、変数をconstexprとして宣言して、外部リンケージを持たせることはできません。ただし、これを単一の変換単位で行うだけの場合を除きます。その理由は、constexpr変数には初期化子が必要であり、初期化子を使用した宣言は定義であり、定義は1つだけにする必要があるためです。

ただし、canができることは、externとして宣言する(定義しない)ことができる通常の積分定数を使用することです。それが定義されている翻訳単位は、定数式としても使用できます。

lib.h:

extern const int a;

lib.cpp:

#include "lib.h"

const int a = 10;

int b[a] = {1, 2, 3};   // OK in this translation unit

C++ 17には、次のように言うことができる「インライン変数」という新機能があります。

inline constexpr int a = 10;

そして、これは繰り返し表示できる「インライン定義」であり、各定義はsameエンティティを定義します(他のすべての「インライン」エンティティと同様に、言語)。

15
Kerrek SB