有没有一种方法可以将std :: atomic存储在struct内部,std :: pair对内部?

问题描述 投票:0回答:1

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

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

我已将问题简化为以下代码(为了清楚/集中起见,删除了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的is_copy_constructiblefirst时检查是否为second
  • 因为std::atomic或第二个参数不是is_copy_constructible,所以未创建构造函数定义。
  • 然后编译器退回到std::pair(const std::pair&) = default复制构造函数,该构造函数失败,因为参数数量不正确(两个而不是一个),并且参数类型不正确。

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

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

我以为初始化器可能太早用于构造,也尝试过:

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

也许我缺少明显的东西……有人知道一种在std::atomic中存储包含std::pair的结构的方法吗?

c++ struct c++17 std-pair stdatomic
1个回答
0
投票

由于评论中通过链接给出了答案,并且我不知道答案将持续多久,因此我将复制/粘贴@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)};
    //...
}
© www.soinside.com 2019 - 2024. All rights reserved.