はい、いいえ; あなたが使用することができますextern:
[C++11: 3.5/3]: 名前空間スコープ(3.3.6)を持つ名前は、
- 明示的に宣言された変数、関数、または関数テンプレート
static。また、
- 明示的に宣言されている変数、
constまたは明示的に宣言されていないconstexprか、外部リンケージを持つように以前に宣言されていない変数。またextern
- 匿名ユニオンのデータメンバー。
それで:
namespace foo
{
extern constexpr double bar() { return 1.23456; }
extern constexpr double baz = 1.23456;
}
他の変換ユニットでは、関数の名前を宣言して参照できるようになります。
#include <iostream>
namespace foo
{
extern constexpr double bar();
}
int main()
{
std::cout << foo::bar() << '\n';
}
ただし、constexpr 変数のルールでは、定義でもない宣言を作成することはできないと規定されています。
[C++11: 7.1.5/9]:constexprオブジェクト宣言で使用される指定子は、オブジェクトをとして宣言しますconst。このようなオブジェクトはリテラルタイプであり、初期化されます。[..]
したがって、で同じアプローチを取ることはできませんbaz。