有没有办法将 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
的模板检查参数是否为 is_copy_constructible
,当参数指定 std::pair 的 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::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)};
//...
}
当我尝试将 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
的模板检查参数是否为is_copy_constructible
,当参数指定 std::pair 的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::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)};
//...
}