以下代码段出现错误

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传递状态。

10-08 06:32