有没有办法将 std::atomic、std::atomic 存储在结构中、std::pair 中?

Is there a way to store std::atomic, inside a struct, inside an std::pair?

当我尝试将 std::atomic 添加到存储在 std::pair 中的结构(在 std::unordered_map 中)时,VS2017 出现以下错误:

error C2660: 'std::pair<uint32_t,AtomicStruct>::pair': function does not take 2 arguments

我已将问题简化为以下代码(删除 clarity/focus 的 std::unordered_map):

#include <iostream> // std::cout
#include <utility>  // std::pair
#include <atomic>   // std::atomic

struct AtomicStruct
{
    std::atomic_uint32_t a;

    // associated data goes here...
};

using AtomicPair = std::pair<uint32_t, AtomicStruct>;

int main()
{
    AtomicStruct as = { 1 };                    // This initializer works just fine
    std::cout << "as: " << as.a << std::endl;   // Outputs "as: 1" as expected

    AtomicPair pr1(0, as);                      // error C2660
    AtomicPair pr2(0, { 1 });                   // error C2660

    return 0;
}

到目前为止我拼凑的内容:

如果我从结构中删除 std::atomic,我可以将它直接放入 std::pair

std::pair<uint32_t, std::atomic_uint32_t> pr3(0, 1);    // Works!

我想也许初始化器被用于构造太早了,也尝试过:

AtomicPair pr4(0, { { 1 } });  // error C2660

也许我遗漏了一些明显的东西...有谁知道在 std::pair 中存储包含 std::atomic 的结构的方法吗?

由于在评论中通过 link 给出了答案,我不知道它会存在多久,所以我 copy/pasting [=18] 的关键部分=] 由@NathanOliver 提供,以防其他人需要答案。

正如@Nichol_Bolas 所指出的,我最初的意图是让 AtomicStruct 成为一个聚合;如果有人知道改进以下答案并保持 AtomicStruct 总体的方法,我愿意接受建议。

struct AtomicStruct
{
    std::atomic_uint32_t a;
    AtomicStruct(uint32_t a) : a(a) {}
    // associated data goes here...
};

int main()
{
    //... 
    AtomicPair pr1{std::piecewise_construct, std::forward_as_tuple(0), std::forward_as_tuple(1)};
    //...
}