我有以下代码:
enum class State : uint32_t
{
FREE,
IDLE,
COAST,
MOVE,
STOP
};
std::atomic<State> car1_state = State::IDLE; <--- Line a
std::atomic<State> car2_state(State::IDLE); <--- Line b
以下是原子头文件的片段:
// c++ header file - atomic
template<typename _Tp>
struct atomic
{
private:
_Tp _M_i;
public:
atomic() noexcept = default;
~atomic() noexcept = default;
atomic(const atomic&) = delete; <--- Line c
atomic& operator=(const atomic&) = delete;
atomic& operator=(const atomic&) volatile = delete;
constexpr atomic(_Tp __i) noexcept : _M_i(__i) { } <--- Line d
operator _Tp() const noexcept
{ return load(); }
operator _Tp() const volatile noexcept
{ return load(); }
_Tp
operator=(_Tp __i) noexcept
{ store(__i); return __i; }
....
我有几个问题:
- b 行编译正常。我理解 d 行中的构造函数被调用。对吧?
- a 行编译失败。根据错误消息,调用了 c 行中的复制构造函数,因此错误消息“使用已删除的函数”(我理解)。
谁能帮我理解线路 a 为什么/如何最终调用线路 c(而不是线路 d)。
最佳答案
复制初始化需要一个可访问的、非显式复制或移动构造函数,因为它从相同类型的临时纯右值正式初始化变量。也就是说,
Foo a = x;
相当于:
Foo a = Foo(x);
您的类型没有可访问的复制构造函数,因此出现错误。相比之下,直接初始化不需要复制构造函数:
Foo a(x);
关于c++ - "struct atomic"的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369043/