C++能否在三元运算符中使用std::weak_ptr的lock()赋值并取值?
编译失败的原因
你写的代码无法编译主要有两个核心问题:
- 运算符优先级错误:C++中
<<输出运算符的优先级高于三元运算符?:,你写的代码会被编译器解析为(std::cout << (auto p = w.lock())) ? *p : "Empty";,第一步尝试将shared_ptr直接输出到cout本身就不合法,逻辑也完全不符合你的预期。 - 语法规则限制:在C++17之前,只有
if、switch的条件分支支持在括号内声明变量,三元运算符的条件位置不支持直接声明auto p这类变量。
等价简写实现方案
你可以通过立即调用lambda表达式实现你要的简写效果,兼容C++11及所有后续标准,写法如下:
std::cout << [&]() { auto p = w.lock(); return p ? *p : "Empty"; }() << "\n";
这个写法相当于定义了一个匿名函数后立刻执行,把weak_ptr判断、取值的逻辑封装在lambda内部,执行后直接返回对应结果输出。
如果你的编译环境支持C++17及以上版本,原生的if初始化语法已经足够简洁,可读性比强行用三元运算符更好:
if (auto p = w.lock()) std::cout << *p << "\n"; else std::cout << "Empty\n";
内容的提问来源于stack exchange,提问作者Hufh294
相关产品推荐
相关产品推荐

