当我尝试将std::atomic
添加到std::pair
(在std::unordered_map
内部)中的结构中时,VS2017提供以下错误:
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_constructible
和first
时检查是否为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
的结构的方法吗?
答案 0 :(得分: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)};
//...
}