获取类型 'z3::expr' 的临时对象的地址



我想访问z3::expr_vectorz3::expr的地址。

z3::context ctx;
z3::expr_vector x(c);
// populate x with some push_backs ...
// access the address of the first element: 
z3::expr* t1 = &x[0]; // -Waddress-of-temporary: Taking the address of a temporary object 
// of type 'z3::expr' 

我看了一下这个问题,但它只讨论了z3::expr的构造函数。

如果我使用std::vector<z3_expr>,它会起作用:

std::vector<z3::expr> x2;
...
z3::expr* t2 = &x2[0]; // This works

这是有意的吗?也就是说,该地址对用户来说不可用吗?我应该维护std::vector<z3::expr>吗?

此外,如果我想有条件地创建一个z3::expr*,该如何进行?

z3::expr* e;
if (some condition) {
e = &(ctx.bv_const("s", 1)); // this gives the same compiler warning.
} else {
e = &(ctx.bv_const("s", 1)); // as does this.
}
// use e

一些关于正确用法的建议会非常有用。

z3::expr_vectorz3::ast_vector_tpl的typedef,其operator[]按值返回元素,即临时副本。因此,您的z3::expr_vector示例失败了,因为获取临时的内存地址是非法的。

AFAICS,ast_vector_tpl没有任何方法可以通过引用/指针返回对其元素的访问,而只能通过值返回。它的iterator也不起作用(所以像z3::expr* t1 = &*(x.begin());这样的东西也不工作(。

另一方面,std::vector有一个operator[](以及一个带有operator*iterator(,它通过引用返回对其元素的访问,这就是为什么您的std::vector示例有效。