我想访问z3::expr_vector
中z3::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_vector
是z3::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
示例有效。