错误-c正在获取临时的地址

error - c taking address of temporary

本文关键字:地址 获取 错误      更新时间:2023-10-16

我在下面的代码中得到一个错误

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()返回指针本身?或者,如果您只需要观察一个状态,并且从不更改它,则通过值或常量引用传递状态。

问题是您根本无法获取右值表达式的地址。您的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);
}

您可以这样做:

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

但是,老实说,我会修改你的代码,这样你就不会这么做了,像这样向局部变量传递指针是有风险的。也许可以更改setStyle调用,以便它检查空指针?