深入学习 std::optional 与 std::variant
深入学习 std::optional 与 std::variant 头文件:<optional> / <variant> 命名空间:std 编译器要求:C++17 起(C++23 新增 optional 单子操作) 一、std::optional — “可能没有值” 1.1 设计动机:告别哨兵值 在没有 optional 之前,表示"函数可能失败/无结果"的常见手段: 1 2 3 4 5 6 7 8 9 10 11 // ❌ 方法1:返回指针(语义不清:谁拥有这块内存?要不要 delete?) Player* findPlayer(uint64_t id); // 返回 nullptr 表示没找到 // ❌ 方法2:输出参数(调用者被迫声明变量,代码臃肿) bool findPlayer(uint64_t id, Player& out); // ❌ 方法3:哨兵值(-1 表示无效?如果 -1 是合法值呢?) int getScore(const std::string& name); // 返回 -1 表示没找到 // ❌ 方法4:抛异常("没找到"不是异常情况,不应该用异常控制流) Player& findPlayer(uint64_t id); // 抛 std::runtime_error 每种方法都有缺陷: 语义不清、容易误用、性能差。 ...