C++中对std::optional<Container>使用基于范围的for循环无法运行的问题咨询
C++中对std::optional使用基于范围的for循环无法运行的问题咨询
大家好,我最近在项目里碰到了一个C++的问题,特意从实际代码里提炼了一段简化版本来复现它,想请教下各位大佬这是怎么回事。
先给大家看我的代码:
#include <iostream> #include <optional> #include <string> #include <unordered_set> std::unordered_set<std::string> getRegularContainer() { return {"apple", "banana", "cherry"}; } std::optional<std::unordered_set<std::string>> getOptionalContainer() { return {"apple", "banana", "cherry"}; } int main() { // 这个基于范围的for循环完全正常运行 for (const auto& item : getRegularContainer()) { std::cout << item << " "; } std::cout << "\n"; // 这个针对std::optional<容器>的for循环却无法正常编译运行 // 我试了unordered_set、vector、string等好几种容器,结果都是一样的 for (const auto& item : getOptionalContainer()) { std::cout << item << " "; } std::cout << "\n"; return 0; }
我分别用--std=c++20和--std=c++17这两个标准编译了这段代码,第一个直接返回容器的for-loop没任何问题,但第二个返回std::optional<Container>的for-loop就是跑不起来。我实在搞不懂为什么针对可选容器的范围for循环会失败,想请大家帮忙分析下原因,谢谢啦!
备注:内容来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

