代码之家  ›  专栏  ›  技术社区  ›  SadSido

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

  •  1
  • SadSido  · 技术社区  · 14 年前

    大家好!

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

    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”表达式中创建的临时对象将一直存在到该表达式结束。所以,对“半径”和“中心”的调用是合法的。但另一方面,使用对临时变量的引用是一种未定义的行为,在我看来,我正在做这种事情——使用(*this),其中“this”是临时的。它给了我一些疑问,所以,请澄清。谢谢!

    4 回复  |  直到 14 年前
        1
  •  2
  •   Dr. Snoopy    14 年前

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

        2
  •  1
  •   tenfour    14 年前

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

    SomeFunc(&CCircleSetter(myCircle))
    

    这将是对温度变量的引用。

        3
  •  0
  •   Collin Dauphinee    14 年前

    我不认为临时引用是未定义的,它只是被禁止的。另外,我相信这只适用于函数参数。Visual Studio允许您在默认的警告/错误级别上传递对非常量临时变量的引用,不过我知道GCC不会。

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

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

        4
  •  0
  •   sbi    14 年前

    你所做的基本上和

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

    哪一个和

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

    我认为这从可用性POV中是可以的。(它当然没有句法/语义问题。)

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

    if ( CCircleSetter(myCircle).Radius(10) != 10 )
    
    推荐文章