私はいくつかのC++静的分析ルールを実装していますが、そのうちの1つは、関数が関数の参照パラメーターへの参照またはポインターを返すことを禁止しています。つまり、以下はすべて非準拠です。
int *f(int& x) { return &x; } // #1
const int *g(const int& x) { return &x; } // #2
int& h(int& x) { return x; } // #3
const int& m(const int& x) { return x; } // #4
これを正当化する理由は、「参照パラメーターが一時オブジェクトであるか、パラメーターへの参照であるかは、実装で定義された動作です」ということです。
ただし、C ++のストリーム演算子はこのように記述されているため、私はこれに戸惑っています。
std::ostream& operator<<(std::ostream& os, const X& x) {
//...
return os;
}
C ++のストリーム演算子は、一般に実装定義の動作を示さないと私はかなり確信していると思います。では、何が起こっているのでしょうか。
現在の私の理解によれば、一時的なものは非定数参照にバインドできないことに基づいて、#1と#3が明確に定義されていると思います。したがってint& x
、スコープを超える存続期間を持つ実際のオブジェクトを指します。したがって、そのオブジェクトへのポインタまたは参照を返すことは問題ありません。一時的なものがバインドされている可能性があるため、#2は危険であると予想しconst int& x
ます。その場合、そのアドレスを取得しようとするのは悪い計画のように思われます。#4についてはよくわかりません-私の腸の感覚は、それも潜在的に危険であるということですが、私にはわかりません。特に、次の場合に何が起こるかはわかりません。
const int& m(const int& x) { return x; }
//...
const int& r = m(23);