gpt4 book ai didi

c++11 - 当初始化一个原子类成员时,它需要一个 'deleted' 函数,但添加它会使它不再简单可复制

转载 作者:行者123 更新时间:2023-12-01 13:27:23 25 4
gpt4 key购买 nike

当初始化一个原子类成员时,它需要一个“删除”函数,但添加它会使它不再是普通可复制的,这是对象/结构是原子的要求。我只是不明白如何正确地做到这一点,还是这是 c++ 标准中的一个问题?

举个例子:

#include <atomic>
#include <cstdint>

template<typename T>
struct A
{
T * data;
std::atomic<uintptr_t> next;
};

template<typename T>
class B
{
std::atomic<A<T>> myA;

public:
B ( A<T> & a ) noexcept
{
myA.store(a, std::memory_order_relaxed );
}
};

int main ()
{
A<int> a;
B<int> b(a);
return 0;
}

尝试用 g++ 编译它给出 error: use of deleted function 'A<int>::A(const A<int>&)' myA.store(a, std::memory_order_relaxed); .我对这个错误的理解是 atomic::store 方法正在我的 struct A 中寻找那个构造函数。但没有找到它。

现在这是我添加该构造函数时发生的情况:

#include <atomic>
#include <cstdint>

template<typename T>
struct A
{
T * data;
std::atomic<uintptr_t> next;
A(const A<T>& obj) { }
A( ) { }

};

template<typename T>
class B
{
std::atomic<A<T>> myA;

public:
B ( A<T> & a ) noexcept
{
myA.store(a, std::memory_order_relaxed );
}
};

int main ()
{
A<int> a;
B<int> b(a);
return 0;
}

我不再收到上述编译器错误,而是收到来自原子类要求的新错误 required from 'class B<int>' .... error: static assertion failed: std::atomic requires a trivially copyable type ...换句话说,通过添加使用定义的构造函数,我创建了 struct A无法在 class B 中初始化的非平凡可复制对象.但是,如果没有用户定义的构造函数,我将无法使用 store myA.store(a, std::memory_order_relaxed) 中的方法.

这似乎是 std::atomic 的设计缺陷类(class)。现在也许我只是做错了什么,因为我没有太多使用 C++11 及更高版本的经验(我是老派)。从11开始,变化很大,要求似乎也严格了很多。我希望有人能告诉我如何实现我想要实现的目标。

我也不能改变std::atomic<A<T>> myA;std::atomic<A<T>> * myA; (更改为指针)或 std::atomic<A<T>*> myA; .我意识到这会编译,但它会破坏我试图构建的类的基本设计。

最佳答案

这里的问题在于 std::atomic 需要 trivially copiable type。 .这是因为普通可复制类型是 C++ 中唯一可以通过直接复制其内存内容(例如通过 std::memcpy)直接复制的确定类型。此外,非以前的普通可复制类型对于原始副本可能是安全的,但不能对此做出任何假设。

这对于 std::atomic 确实很重要,因为临时值的复制是通过 std::memcpy 进行的,参见一些 implementation details以 Clang 为例。

同时 std::atomic 不是可复制构造的,这是出于合理的原因,检查 this answer例如,因此它隐式不可复制(也不是包含它们的任何类型)。

荒谬的是,如果您允许 std::atomic 包含另一个 std::atomic,并且 std::atomic 的实现code> 包含一个锁,你将如何管理以原子方式复制它?它应该如何运作?

关于c++11 - 当初始化一个原子类成员时,它需要一个 'deleted' 函数,但添加它会使它不再简单可复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47836307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com