std::atomic 作为 std::map 的值

Vla*_*tow 6 gcc dictionary atomic c++11 visual-studio-2012

我想在地图中使用原子变量。我正在使用 Visual Studio 2012 (msvc-11) 和 gcc 4.7。我定义了一个类型:

typedef std::map<uint64_t, std::atomic<int64_t>> value_map_t;
Run Code Online (Sandbox Code Playgroud)

在 msvc-11 中,行

value_map_t map;
map[1] = 0;
Run Code Online (Sandbox Code Playgroud)

产生错误:

错误C2248::std::atomic<__int64>::atomic无法访问类中声明的私有成员std::atomic<__int64>

gcc 4.7 也会发生同样的情况(参见此处

错误:使用已删除的函数std::atomic<long int>::atomic(const std::atomic<long int>&)

但是,在 Visual Studio 2013 (msvc-12) 及更高版本以及 gcc 4.8 及更高版本中,它运行良好。

亲自查看gcc 4.8Visual Studio 2013+

我可以在 msvc-11/gcc 4.7 中做什么才能使其工作?

Ami*_*ory 4

我无法访问 Visual C++ 编译器,但我猜测以下内容可能有效。使用间接寻址,利用 s 的(智能)指针的映射atomic

#include <atomic>
#include <map>
#include <memory>


using atomic_ptr_t = std::shared_ptr<std::atomic<int64_t>>;
typedef std::map<uint64_t, atomic_ptr_t> value_map_t;


int main()
{
    value_map_t map;
    map[1] = atomic_ptr_t(new std::atomic<int64_t>(0));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 问题似乎是此类编译器尚未实现足够的 C++11,例如[此更改](http://en.cppreference.com/w/cpp/container/map/operator_at),它允许` map::operator[]` *仅*默认构造映射项,而不需要任何复制/移动构造函数。 (4认同)