链接方法和临时变量,请澄清

时间:2010-08-09 19:38:53

标签: c++ chaining temporary-objects

问候,大家!

我有一个类接收指向“圆圈”的指针(例如),然后通过一些“链接”方法调整其属性。像这样:

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 个答案:

答案 0 :(得分:2)

不,在这个非常具体的情况下,这很好,因为临时将在整行执行后被销毁,但一般来说对于临时工具的引用是非常糟糕的。

答案 1 :(得分:1)

即使它是一个临时变量,也不意味着它的所有成员都是临时的。在临时对象的范围内,this指针和其他成员不是临时的。你的代码完全没问题。现在,如果你做了类似的事情:

SomeFunc(&CCircleSetter(myCircle))

这将是对临时变量的引用。

答案 2 :(得分:0)

我不认为对临时的引用是不确定的,它只是被禁止的。另外,我相信这只适用于函数参数。 Visual Studio将允许您在默认警告/错误级别上传递对非const临时对象的引用,但我知道gcc不会。

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

我认为你正在做的事情没有任何问题。

答案 3 :(得分:0)

你所做的与

基本相同
if( istrm >> a >> b ) ...

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

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

然而,像往常一样,隐式转换为bool有点讨厌,因为它允许编译意外的代码:

if ( CCircleSetter(myCircle).Radius(10) != 10 )