はい、いいえ; あなたが使用することができます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
。