问候,大家!
我有一个类接收指向“圆圈”的指针(例如),然后通过一些“链接”方法调整其属性。像这样:
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”是临时的。它给了我一些疑问,所以请澄清一下。谢谢!
答案 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 )