以下代码段出现错误
void setStyle(const ctlStyleBase* style)
{
//do something
}
void create(const ctlStyleBase* style = 0)
{
if(style == 0) setStyle(&ctlStyleGradient()); // error : taking address of temporary
else setStyle(style);
}
我不认为这是错误的,因为我只在setStyle中使用它,并且在setStyle返回之前它不会被破坏。
有人可以告诉我代码是否有问题吗?
[编译器g ++ 4.7.2]
最佳答案
好吧,很难-这是语言的规则,您不能使用临时对象的地址。该规则的原因是,从根本上没有这样做的充分理由。
在您的示例中,ctlStyleGradient()
返回类型为ctlStyleBase
的某些对象。如果要在setStyle
函数中修改该对象(尽管在本例中不是这样),则一旦完成,该对象就会不复存在,从而使整个修改毫无意义。
是的,您可以在操作有明显副作用的地方设计代码,但其本身的样式将非常糟糕。因此,没有深层的技术原因说明您不应该使用临时地址,但是该语言决定不让您这样做,因为这被认为是不合适的。
但这似乎不是您要尝试执行的操作。也许您想做的是让ctlStyleGradient()
本身返回一个指针?或者,如果您只需要观察一个状态而从不更改它,则按值或const-reference传递状态。