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_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
的结构的方法吗?
由于评论中通过链接给出了答案,并且我不知道答案将持续多久,因此我将复制/粘贴@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)};
//...
}