P1787には、同じ実体とは何かについての優れた説明があります。
エンティティの 2 つの宣言は、名前のない型の宣言がリンケージ目的で名前を導入することを考慮して、もしあれば ([dcl.typedef]、[dcl.enum])、それらが対応する ([basic.scope.scope]) 場合、同じエンティティを宣言します。 、関数またはテンプレート パラメーターのスコープではない同じターゲット スコープを持ち、かついずれか
- それらが同じ翻訳単位に表示される、または
- 両方ともモジュール リンケージで名前を宣言し、同じモジュールにアタッチされている、または
- どちらも外部リンケージで名前を宣言します。
したがって、次の例を検討してください。
// 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 を考えてみましょう#1
。b
の TU との TUではc
、 のこれら 2 つの宣言value
は対応しており、 の複合ステートメントによって導入される同じターゲット スコープを持っていfunction
ます。ただし、ローカル変数にはリンケージがないため、そのリストのどちらの箇条書きも満たされません。value
では、異なる 2 つの変換単位で (関数の本体にある) for の 2 つの宣言が同じエンティティを宣言したのはなぜでしょうか? P1787のルールを通してそれをどのように解釈するのですか?