私はいくつかのC++の静的解析ルールを実装していて、そのうちの一つは、関数の参照パラメータへの参照やポインタを返すから機能を禁止し、次のIEは、すべての非準拠しています:このC++静的解析ルールは意味を持ちますか?
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++のストリーム演算子は一般的に実装定義の振る舞いを示さないと思うので、どうしていますか?
現時点で私が理解しているところでは、一時参照は非const参照にバインドできないので、#1と#3は明確に定義されています。int& x
は、関数の範囲を超えて生涯があるため、そのオブジェクトへのポインタや参照を返すのは問題ありません。一時的なものがconst int& x
にバインドされている可能性があるので、私は#2がドギーになると予想します。その場合、そのアドレスを取ろうとすると悪い計画に見えるでしょう。私は#4について確信が持てません - 私の直感はそれも潜在的にドギーですが、わかりません。特に、私は次のような場合に何が起こるかについては明らかではないよ:(#1は間違いなく悪いスタイルですが)
const int& m(const int& x) { return x; }
//...
const int& r = m(23);
MSVC++を使用していますか? – Nawaz
@Nawaz:私は大規模なコードベースでクエリを書くのに.QLを使用しています:)私はそれがどのコンパイラであろうと、私は理想的にはプラットフォームに依存しない答えを探しているとは思わないと思います。 –
なぜ私はMSVC++が一時的なものが非const参照にバインドすることを可能にするコンパイラの拡張機能を提供しているので尋ねました。また、Microsoftの静的分析ツールを使用している場合は、この拡張も考慮する必要があります。 – Nawaz