Visual Studio 2022中/Ob2选项下std::sort排序std::deque异常问题
Visual Studio 2022 std::sort对std::deque<std::unique_ptrstd::string>排序错误问题
问题概述
- 触发场景:Visual Studio 2022 17.6.4及17.9版本,Release模式下启用
/Ob2(内联函数展开)编译选项 - 核心问题:调用
std::sort对std::deque<std::unique_ptr<std::string>>排序时返回错误结果 - 对比验证:
- 移除
/Ob2选项后,排序结果恢复正常 - 使用
std::vector<std::unique_ptr<std::string>>或std::deque<std::string>时无此异常
- 移除
复现代码
#include <iostream> #include <deque> #include <algorithm> #include <memory> #include <string> int main() { std::deque<std::unique_ptr<std::string>> dq; dq.emplace_back(std::make_unique<std::string>("3")); dq.emplace_back(std::make_unique<std::string>("1")); dq.emplace_back(std::make_unique<std::string>("2")); std::sort(dq.begin(), dq.end(), [](const auto& a, const auto& b) { return *a < *b; }); for (const auto& ptr : dq) { std::cout << *ptr << " "; } std::cout << std::endl; // 错误输出示例:3 1 2 (或其他不符合升序规则的结果) return 0; }
结论与临时解决方案
这是Visual Studio标准库的已知Bug,根源在于/Ob2内联优化与std::deque处理std::unique_ptr元素时的实现冲突。临时可采用以下方案规避:
- 临时禁用
/Ob2编译选项(需权衡性能损失) - 替换
std::deque为std::vector存储std::unique_ptr<std::string> - 若必须使用
std::deque,可手动实现稳定排序逻辑(仅作为应急方案)
内容的提问来源于stack exchange,提问作者Tiep Vu
相关产品推荐
相关产品推荐

