从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[]>:绕开构造函数的问题,直接用原始指针和删除器构造,代码示例:
这种方式完全符合标准,且兼容所有支持C++17的标准库实现。#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; }
内容的提问来源于stack exchange,提问作者Rock
相关产品推荐
相关产品推荐

