1

P1787には、同じ実体とは何かについての優れた説明があります。

エンティティの 2 つの宣言は、名前のない型の宣言がリンケージ目的で名前を導入することを考慮して、もしあれば ([dcl.typedef]、[dcl.enum])、それらが対応する ([basic.scope.scope]) 場合、同じエンティティを宣言します。 、関数またはテンプレート パラメーターのスコープではない同じターゲット スコープを持ち、かついずれか

  1. それらが同じ翻訳単位に表示される、または
  2. 両方ともモジュール リンケージで名前を宣言し、同じモジュールにアタッチされている、または
  3. どちらも外部リンケージで名前を宣言します。

したがって、次の例を検討してください。

// a.hpp
inline int& function(){
   static int value = 0; // #1
   return value;
}
----------------------
//b.cpp
#include "a.hpp"
void g(){
  auto&& rf = function();
}
----------------------
//c.cpp
#include "a.hpp"
int main(){
 auto&& rf0 = function();
}

注記を除いて、次のように述べています。

[ 注: 外部またはモジュール リンケージを持つインライン関数または変数は、複数の翻訳単位 ([basic.def.odr]) で定義できますが、1 つのアドレスを持つ 1 つのエンティティです。したがって、そのような関数の本体で定義された型または変数は、単一のエンティティです。

valueただし、宣言された at を考えてみましょう#1bの TU との TUではc、 のこれら 2 つの宣言valueは対応しており、 の複合ステートメントによって導入される同じターゲット スコープを持っていfunctionます。ただし、ローカル変数にはリンケージがないため、そのリストのどちらの箇条書きも満たされません。valueでは、異なる 2 つの変換単位で (関数の本体にある) for の 2 つの宣言が同じエンティティを宣言したのはなぜでしょうか? P1787のルールを通してそれをどのように解釈するのですか?

4

1 に答える 1