【发布时间】:2021-11-23 11:56:01
【问题描述】:
使用std::weak_ptr时,最好使用lock()方法访问对应的std::shared_ptr,如下:
std::weak_ptr<std::string> w;
std::shared_ptr<std::string> s = std::make_shared<std::string>("test");
w = s;
if (auto p = w.lock())
std::cout << *p << "\n";
else
std::cout << "Empty";
如果我想用三元运算符来简写这个,看起来是这样的:
std::cout << (auto p = w.lock()) ? *p : "Empty";
将是有效的代码,但这不会编译。
是否可以将这种方法与三元运算符一起使用?
【问题讨论】:
-
条件表达式的所有部分依次是表达式。您不能在表达式中定义变量。
-
有些相关:what's an expression and expression statement in c++? 和 Expression Versus Statement。声明不是 C++ 中的表达式,因此无法在
?:的第一个表达式内声明p。然而,assignments 是表达式,所以像(p = w.lock()) ? *p : "Empty"这样的东西是有效的,假设p已经被声明了。 -
你可以在三元之外声明
p,然后在里面赋值,但是你不能使用占位符auto。应该是std::shared_ptr<std::string> p; std::cout << (p = w.lock()) ? *p : "Empty"; -
@NateEldredge 在这种情况下您可能无法使用
auto,但您仍然可以从weak_ptr中推断出shared_ptr类型,使用std::shared_ptr<decltype(w)::element_type> p;或更简单的@ 987654339@