5

外部リンケージを使用して名前空間スコープ定数を作成しようとしています

// in some include file:

namespace foo 
{
    constexpr double bar() { return 1.23456; } // internal linkage
    constexpr double baz = 1.23456;            // internal linkage
    const double bing = 1.23456;               // internal linkage
}

これも可能ですか?

4

2 に答える 2

10

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

于 2013-01-31T00:04:17.117 に答える
0

constexpr関数の場合inlineは、を意味します。これは、外部リンケージを意味します。だからあなたはすでにあなたが望むものを持っていますbarbazおよびについてbingは、C++17でインラインで宣言することもできます。

https://stackoverflow.com/a/4193698/261217も参照してください

于 2019-10-21T21:51:27.230 に答える