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 的方式是否发生了变化?我现在需要创建共享指针的原子对象吗?
以下代码可以在 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 原子访问 | 部分的