在三元运算符中赋值
Assign value in ternary operator
当使用 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";
将是有效代码,但无法编译。
是否可以将此方法与三元运算符一起使用?
auto p = w.lock()
不是赋值。这是一个变量的声明。您可以在 if
语句的条件中声明变量,但不能在条件表达式中声明变量。
你可以这样写:
auto p = w.lock();
std::cout << (
p ? *p
: "Empty"
);
如果你想为表达式引入一个变量(如 Lisp 中的 let
或 Haskell),你可以使用 lambda:
std::cout << [p = w.lock()] {return p ? *p : "Empty";}();
这也限制了 ?:
,它将 std::cout
解释为您问题中 条件 的一部分。
当使用 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";
将是有效代码,但无法编译。
是否可以将此方法与三元运算符一起使用?
auto p = w.lock()
不是赋值。这是一个变量的声明。您可以在 if
语句的条件中声明变量,但不能在条件表达式中声明变量。
你可以这样写:
auto p = w.lock();
std::cout << (
p ? *p
: "Empty"
);
如果你想为表达式引入一个变量(如 Lisp 中的 let
或 Haskell),你可以使用 lambda:
std::cout << [p = w.lock()] {return p ? *p : "Empty";}();
这也限制了 ?:
,它将 std::cout
解释为您问题中 条件 的一部分。