4

この質問は、このC ++静的分析ルールはそのまま意味がありますか?に関連しています。、しかし多少異なります。関数がそのconst参照パラメーターを参照として返すケースを見つけるために、静的分析ルールを実装しました。

const X& f(const X& x) { return x; }

一時的なものがにバインドされるとx、これは潜在的に危険です。一時的なものの存続期間は、の戻り値がf呼び出し元の参照にバインドされる前に終了するためです。別の言い方をすれば、これには問題があります。

const X& r = f(X());

minルールを実行すると、次のような標準ライブラリの実装が見つかります。

template<typename _Tp>
inline const _Tp&
min(const _Tp& __a, const _Tp& __b)
{
  // concept requirements
  __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
  //return __b < __a ? __b : __a;
  if (__b < __a)
    return __b;
  return __a;
}

これは明らかにそのconst参照パラメーターを参照として返しますが、関数はinlineです。これは一時的な寿命の点で違いがありますか、それともこれは本当に少し危険ですか?この関数には次のコメントが付いているので、一時的に呼び出すことができるようになっていることは明らかです。

*  This is the simple classic generic implementation.  It will work on
*  temporary expressions, since they are only evaluated once, unlike a
*  preprocessor macro.
4

1 に答える 1

1

関数がインラインであるかどうかは、一時的なものの寿命にまったく違いはありません。fyour (または)のような関数の戻り値std::minをローカルスコープのconst参照にバインドすることは、ぶら下がっている参照になってしまう確実な方法です。しかし、本当の危険がどこにあるのかわかりません。なぜなら、そもそも長生きしたものへの参照でない限り、それは合理的なコードで行うことではないからです。

T const& obj = std::min( myMap['x'], myMap['y'] );

このような特別な場合を除いて、ローカル変数は参照ではなく値になります。

于 2012-07-18T10:53:07.997 に答える