You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:52:41