错误-c正在获取临时的地址
error - c taking address of temporary
我在下面的代码中得到一个错误
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
调用,以便它检查空指针?
- 如何在C++中获取该对象的类声明中对象的地址?
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 如何获取C++字符数据类型的地址
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- 如何根据指针地址获取指针内容
- 从对象及其成员的地址获取指向成员的指针
- 如何从地址获取字符串?
- 从内存地址获取值
- PIN从指令地址获取程序集操作码
- 使用数组的地址获取过期指针
- 从调用堆栈地址获取函数参数
- 从IP地址获取完整的计算机名称,例如 abc.xyz.xvvx.net
- 如何通过地址获取元组中元素的索引
- 从成员的地址获取成员的索引
- 从IPv4地址获取网络接口名称
- 如何通过符号在内存中的地址获取有关符号的更多信息
- 正在WinDbg中按地址获取类型