は、我々は次のことを含むヘッダfoo.h
を持って想像:C++標準:名前空間スコープのconstexpr変数に内部リンケージがありますか?
#ifndef FOO_H_
#define FOO_H_
namespace foo {
constexpr std::string_view kSomeString = "blah";
}
#endif // FOO_H_
はfoo.h
を含む任意の翻訳単位で内部リンケージを持つことが保証foo::kSomeString
ですか?これはC++ 11とC++ 17の間で異なりますか?ドラフトで
標準[basic.link]/3は、不揮発性const修飾型の非インライン可変[...]それの名前である場合、名前空間の範囲を有する名前が内部結合を有する
言いますどちらも明示的にextern宣言もなく、以前に外部リンケージを持つように宣言[...]
しかし、私は知っていない場合は、「const修飾」としてconstexpr
カウント。スタンダードはそうだと言いますか?
これは内部リンケージが保証されていると仮定すると、この使用法でODRに問題はないようですね。 (this answerとは対照的に)
はい、 'constexpr'宣言はC++ 11では' const'を意味します。 C++ 14以降では、メンバ関数ではなく変数に 'const'を含めるだけです。 –
ありがとう!スタンダードのどのセクションにそのことが分かっていますか? – jacobsa