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

从unique_ptr<T[]>初始化shared_ptr<T[]>时构造函数不匹配编译错误

关于unique_ptr<T[]>转shared_ptr<T[]>的编译问题解答

1. 测试代码是否存在错误?

你的代码本身没有错误,完全符合C17标准。C17明确为std::shared_ptr<T[]>添加了从std::unique_ptr<T[]>(或带自定义删除器的std::unique_ptr<T[], D>)构造的重载。示例标准代码如下:

#include <memory>

int main() {
    std::unique_ptr<int[]> up(new int[5]);
    // 符合C++17标准的转换方式
    std::shared_ptr<int[]> sp(std::move(up));
    return 0;
}

这段代码的逻辑和语法都是合规的,不存在代码层面的错误。

2. 为何两个环境的编译结果不同?

核心原因是不同平台下的标准库实现差异:

  • Ubuntu的g++ 11.4.0使用的是GNU的libstdc++,该版本的libstdc++已经完整实现了C++17中shared_ptr<T[]>的相关构造函数重载,因此编译通过。
  • Windows的llvm-mingw g++ 12.0.0可能存在两种情况:
    • 配套的libstdc++版本在mingw平台上未完整实现shared_ptr<T[]>从unique_ptr<T[]>构造的重载(部分平台的标准库实现会有特性延迟);
    • 编译时默认未完全启用C++17标准(虽然单个对象转换正常,但数组版的特性可能需要更严格的标准开关)。

3. 如何在Windows的llvm-mingw环境下让代码正常编译?

可以尝试以下几种解决方案:

  • 明确指定C++标准版本:编译时添加-std=c++17或更高版本的参数(比如-std=c++20),确保编译器启用完整的C++17特性,命令示例:
    g++ -std=c++17 your_code.cpp -o your_program
    
  • 升级llvm-mingw版本:更新到最新版的llvm-mingw,后续版本的标准库大概率修复了该构造函数的实现问题。
  • 切换到libc++标准库:编译时添加-stdlib=libc++参数,使用LLVM的libc++替代GNU的libstdc++,libc++对C++17数组版智能指针的支持更完善,命令示例:
    g++ -std=c++17 -stdlib=libc++ your_code.cpp -o your_program
    
  • 手动构造shared_ptr<T[]>:绕开构造函数的问题,直接用原始指针和删除器构造,代码示例:
    #include <memory>
    
    int main() {
        std::unique_ptr<int[]> up(new int[5]);
        // 手动传入原始指针和数组删除器
        std::shared_ptr<int[]> sp(up.release(), std::default_delete<int[]>());
        return 0;
    }
    
    这种方式完全符合标准,且兼容所有支持C++17的标准库实现。

内容的提问来源于stack exchange,提问作者Rock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:36:12