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

Taking the address of a temporary object of type 'z3::expr'

我想访问 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' 

我看了一下 this question,但那只讨论了 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, whose operator[]returns个元素by value的typedef,即一个临时的copy。所以你的 z3::expr_vector 示例失败了,因为获取临时内存地址是非法的。

AFAICS,ast_vector_tpl 没有任何方法可以 return 通过 reference/pointer 访问其元素,仅通过值。它的 iterator 也没有(所以,像 z3::expr* t1 = &*(x.begin()); 这样的东西也不起作用)。

另一方面,

std::vector 有一个 operator[](和一个带有 operator*iterator),return 可以访问它的元素通过引用 代替,这就是为什么您的 std::vector 示例有效。