gpt4 book ai didi

c++ - 将 std::shared_ptr 与 clang++ 和 libstdc++ 一起使用

转载 作者:IT老高 更新时间:2023-10-28 23:11:19 25 4
gpt4 key购买 nike

我正在尝试使用 libstdc++(4.6.1) 在 clang++(clang 版本 3.1 (trunk 143100)) 中使用 std::shared_ptr。我有一个小演示程序:

#include <memory>

int main()
{
std::shared_ptr<int> some(new int);
std::shared_ptr<int> other(some);
return 0;
}

可以使用:

clang++ -std=c++0x -o main main.cpp

并给出以下错误输出:

main.cpp:6:23: error: call to deleted constructor of 'std::shared_ptr<int>'
std::shared_ptr<int> other(some);
^ ~~~~
/usr/include/c++/4.6/bits/shared_ptr.h:93:11: note: function has been explicitly marked
deleted here
class shared_ptr : public __shared_ptr<_Tp>

由于某种原因,它需要删除构造函数,因为提供了移动构造函数(这是正确的行为)。但是为什么它可以与 (g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1.) 一起编译?有人对如何解决这个问题有任何想法吗?

最佳答案

根据 C++11 12.8p7,shared_ptr 的隐式声明的复制构造函数被删除,因为 shared_ptr 具有移动构造函数或移动赋值运算符(或两者):

如果类定义没有显式声明复制构造函数,则隐式声明。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,它被定义为默认(8.4)。

GCC 4.6.x 没有实现这个规则,它在这个过程中很晚才以 N3203=10-0193 的形式出现在 C++11 工作文件中。 . libstdc++ 4.6.x 中的 shared_ptr 在编写时是正确的,但此后 C++11 发生了变化。Boost 有 exactly the same issue它是 shared_ptr,这是 common incompatibilities 之一在 GCC 和 Clang 之间。

向 shared_ptr 添加默认的复制构造函数和复制赋值运算符将解决问题。

关于c++ - 将 std::shared_ptr 与 clang++ 和 libstdc++ 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7964360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com