获取类型 '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_vector
是z3::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
示例有效。
我想访问 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_vector
是z3::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
示例有效。