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 将允许您在默认警告/错误级别上传递对非常量临时对象的引用,尽管我知道 gcc 不会。

据我所知,这样做只是被禁止的,因此程序员不会通过存储对超出范围的临时对象的引用来自取其辱。考虑到这是 C++,我觉得这很愚蠢。

我看不出你在做什么有任何问题。

于 2010-08-09T19:43:30.653 回答
0

你在做什么基本上和在

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

这与

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

从可用性 POV 来看,我认为这很好。(当然没有句法/语义问题。)

但是,与往常一样,隐式转换为 bool 有点讨厌,因为它允许编译意外代码:

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