1

皆さん、こんにちは!

「円」へのポインターを受け取り (たとえば)、いくつかの「連鎖」メソッドを介してその属性を調整するクラスがあります。このようなもの:

class CCircleSetter
{
public:
   explicit CCircleSetter( CCirclePtr circle ) : m_circle(circle)
   {
   }

   CCircleSetter & Radius( int radius )
   {
       if (m_circle) m_circle->SetAttribute( "radius", radius );
       return *this;
   }
   CCircleSetter & Center( CPoint center )
   {
       if (m_circle) m_circle->SetAttribute( "center", center );
       return *this;
   }

   operator bool() const
   {
      return ( m_circle != NULL );
   }

private:
   CCirclePtr m_circle;
};

今、このコードが合法かどうか疑問に思います:

if ( CCircleSetter(myCircle).Radius(10).Center(myPoint) ) 
{ ... }

一方で、「if」式の中で作成された一時的なオブジェクトは、この式の最後まで存続すると思います。したがって、「Radius」と「Center」の呼び出しは有効です。しかし一方で、一時変数への参照を使用することは未定義の動作であり、私はまさにこの種のことを行っているように思えます-「this」が一時的な場合、(*this) を使用しています。それは私にいくつかの疑問を抱かせるので、はっきりさせてください。ありがとう!

4

4 に答える 4

2

いいえ、この非常に特殊なケースでは問題ありません。行全体が実行された後に一時が破棄されるためですが、一般的に、一時への参照を保持することは非常に悪いことです。

于 2010-08-09T19:44:25.317 に答える
1

一時変数であっても、すべてのメンバーが一時的であるとは限りません。一時オブジェクトのスコープ内では、thisポインターと他のメンバーは一時的ではありません。あなたのコードは完全に問題ありません。今、あなたが次のようなことをしたとします:

SomeFunc(&CCircleSetter(myCircle))

これは一時変数への参照になります。

于 2010-08-09T19:43:52.050 に答える
0

一時的なものへの参照が未定義であるとは思いません。禁止されているだけです。また、これは関数の引数にのみ適用されると思います。Visual Studio では、デフォルトの警告/エラー レベルで非 const 一時変数への参照を渡すことができますが、gcc ではできないことがわかっています。

私の知る限り、そうすることは禁止されているだけなので、プログラマーは範囲外の一時への参照を保存して自分自身を撃ちません。これが C++ であることを考えると、それは非常にばかげていると思います。

あなたがしていることに何の問題もありません。

于 2010-08-09T19:43:30.653 に答える
0

あなたがやっていることは基本的に同じです

if( istrm >> a >> b ) ...

これはと同じです

if( istream.operator>>(a).operator>>(b).operator some_bool_like_type() )

ユーザビリティの観点からはこれでいいと思います。(確かに、構文/意味の問題はありません。)

ただし、いつものように、bool への暗黙的な変換は、予期しないコードがコンパイルされる可能性があるため、少し厄介です。

if ( CCircleSetter(myCircle).Radius(10) != 10 )
于 2010-08-09T20:05:32.350 に答える