我的代码中有QStandardItem *列表
QList<QStandardItem*> lst
现在这是可以接受的并且有效
float a = lst[0]->text().toFloat();
但以下情况不起作用
float* a = &(lst[0]->text().toFloat());
我收到了一个智能错误陈述
表达式必须是左值或函数指示符
我需要一个指针,因为我使用的外部库需要一个看起来像这样的引用
some_class.add_variable(const std::string& variable_name, float& t);
因此,如果我得到一个指针,我可以简单地将其作为* a
传递关于如何解决此问题的任何建议?
答案 0 :(得分:3)
右侧是所谓的临时。它是一个在当前表达式结束后不存在的对象。出于显而易见的原因,你无法取得临时的地址;表达式结束后,你的指针就会无效。
你能做的是:
float a = lst[0]->text().toFloat();
float* aPtr = &a;
这将安全地复制临时值(或在C ++ 11中,它可能move
临时值),然后您可以引用您的本地非临时变量。
答案 1 :(得分:2)
使用float a = lst[0]->text().toFloat();
并将其作为&a
传递给库函数。
答案 2 :(得分:0)
获取函数返回的临时值的地址不起作用。该值应该分配给左值变量。
为什么你想要float的地址而不是实际值?
您应该只处理已保存在某处的值的地址或指针。
答案 3 :(得分:0)
实际上,你的外部函数不需要地址,需要参考,所以你不需要指针。
但是,如果你真的需要指向局部变量的指针:
float x = something...;
some_function(&x);
会给你你想要的东西。
答案 4 :(得分:0)
注意:如果您在此声明后引用float* a = &(lst[0]->text().toFloat());
,a
将为您提供未定义的行为。这是因为匿名临时(.tofloat()
返回的浮点数)在语句后将超出范围,a
将失效; 即不会指出任何有意义的事情。
您应该写float a = lst[0]->text().toFloat()
,并将&a
传递给该函数。也就是说,只要您需要,就将a
保留在范围内。