原子存储抛出错误

Eum*_*coz 2 c++ c++11 stdatomic

我最近升级到了 C++11 兼容编译器,并且尝试将一些代码从 boost 更新到 c++11 标准。我在使用atomic_store转换一些代码时遇到了问题。这是一些简单的测试代码,似乎会引发编译器错误。

int main()
{
    std::shared_ptr<int> m = std::make_shared<int>();
    *m = 1;

    std::shared_ptr<int> a =  std::make_shared<int>();
    *a = 2;

    std::atomic_store(&m,std::move(a));

    std::cout << *m << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

std::atomic_store(&m,std::move(a));行为我抛出编译器错误:

'std::shared_ptr<int>' is not derived from 'volatile std::atomic<_ITp>'
     std::atomic_store(&m,std::move(a));
                                      ^
Run Code Online (Sandbox Code Playgroud)

从 boost 迁移到 C++11 时,atomic_store 的方式是否发生了变化?我现在需要创建共享指针的原子对象吗?

nos*_*sid 5

以下代码可以在 Clang 3.5 中正常编译:

#include <memory>
int main()
{
    std::shared_ptr<int> foo, bar;
    std::atomic_store(&foo, bar);
}
Run Code Online (Sandbox Code Playgroud)

但是,它无法使用 GCC 4.9 进行编译。上面的代码打印一条错误消息,它atomic_store不是std. 如果我还包含<atomic>,编译器会打印问题中显示的错误消息。

显然,GCC 4.9 不支持std::shared_ptr. 另请参阅libstdc++的文档:

20.7.2.5 | 20.7.2.5 Shared_ptr 原子访问 | 部分的