constexpr 変数に一意のアドレスを割り当てることは可能ですか? つまり、変数が使用可能なすべての変換単位で同じ (通常はヘッダーを介して) ことはできますか? 次の例を検討してください。
// foo.hh
#include <iostream>
constexpr int foo = 42;
// a.cc
#include "foo.hh"
void a(void) { std::cout << "a: " << &foo << std::endl; }
// b.cc
#include "foo.hh"
extern void a(void);
int main(int argc, char** argv) {
a();
std::cout << "b: " << &foo << std::endl;
}
コンパイルa.cc
してb.cc
別々に、gcc 4.7 を使用してそれらをリンクすると、2 つの異なるアドレスが表示されます。ヘッダーにキーワードを追加するとextern
、リンカ エラーが発生しますduplicate symbol _foo in: a.o and b.o
。これは驚くべきことです。これを追加extern
すると、コンパイラがそのシンボルを現在のオブジェクトからエクスポートするのではなく、別のオブジェクトからインポートする可能性が高くなると考えたからです。しかし、ここで物事がどのように機能するかについての私の理解は間違っていたようです。
constexpr を 1 つのヘッダーで宣言し、すべての翻訳ユニットが定数式でそれを使用できるようにし、すべての翻訳ユニットがそのシンボルのアドレスに同意するようにする合理的な方法はありますか? このシンボルが実際に属する単一の翻訳単位を示す追加のコードが期待さextern
れextern
ますconstexpr
。