0

我在以下代码中遇到错误

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]

4

3 回答 3

2

好吧,很难——这是语言的一条规则,你不能获取临时对象的地址。制定规则的原因是,基本上没有充分的理由这样做。

在您的示例中,ctlStyleGradient()返回一些类型的对象ctlStyleBase。如果您想在setStyle函数中修改该对象(尽管在这种情况下您不这样做),那么一旦您完成,该对象将不复存在,从而使整个修改变得毫无意义。

是的,您可以设计操作具有可观察到的副作用的代码,但这本身就是非常糟糕的风格。因此,您不应该获取临时地址并没有什么深刻的技术原因,但是该语言决定不让您这样做,因为它被认为是不合适的。

但这似乎不是你想要做的。也许你的意思是ctlStyleGradient()返回一个指针本身?或者,如果您只需要观察一个状态并且从不更改它,则通过值或通过 const-reference 传递状态。

于 2013-02-13T10:06:26.027 回答
0

问题是您根本无法获取右值表达式的地址。您ctlStyleGradient返回一个ctlStyleBase按值,将其复制出函数。这给了你一个临时的并且ctlStyleGradient()是一个右值表达式。你不能&在这个表达式上做。

如果您不需要修改传递给的对象setStyle,则可以将其更改为const引用:

void setStyle(const ctlStyleBase& style)
{
  //do something
}

if(style == 0) setStyle(ctlStyleGradient());

如果您确实需要修改它,那么您必须获取ctlStyleBase对象的本地副本并通过值或引用传递它:

void setStyle(ctlStyleBase style)
{
  //do something
}


if(style == 0) {
  ctlStyleBase styleCopy = ctlStyleGradient();
  setStyle(styleCopy);
}
于 2013-02-13T10:05:37.003 回答
0

你可以这样做:

void create(const ctlStyleBase* style = 0)
{
      if(style == 0)
      {
          ctlStyleGradient temp;
          setStyle(&temp);
      }
      else setStyle(style);
}

但是,老实说,我会重新编写你的代码,所以你不要这样做,像这样传递指向局部变量的指针是有风险的事情。也许改变setStyle调用以检查空指针?

于 2013-02-13T10:05:53.787 回答