【问题标题】:Assign value in ternary operator在三元运算符中赋值
【发布时间】: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&lt;std::string&gt; p; std::cout &lt;&lt; (p = w.lock()) ? *p : "Empty";
  • @NateEldredge 在这种情况下您可能无法使用auto,但您仍然可以从weak_ptr 中推断出shared_ptr 类型,使用std::shared_ptr&lt;decltype(w)::element_type&gt; p; 或更简单的@ 987654339@

标签: c++ conditional-operator


【解决方案1】:

auto p = w.lock() 不是分配。这是一个变量的声明。您可以在if 语句的条件中声明变量,但不能在条件表达式中声明变量。

你可以写:

auto p = w.lock();
std::cout << (
    p ? *p
      : "Empty"
);

【讨论】:

    【解决方案2】:

    如果您想为表达式引入变量(如 Lisp 或 Haskell 中的 let),您可以使用 lambda

    std::cout << [p = w.lock()] {return p ? *p : "Empty";}();
    

    这也限制了?:,它将std::cout 解释为您问题中条件的一部分。

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2021-04-29
      • 2011-07-02
      • 2012-02-14
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2014-02-12
      相关资源
      最近更新 更多