加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 复制“struct atomic”的构造函数

发布时间:2020-12-16 09:54:47 所属栏目:百科 来源:网络整理
导读:我有以下代码: enum class State : uint32_t{ FREE,IDLE,COAST,MOVE,STOP};std::atomicState car1_state = State::IDLE; --- Line astd::atomicState car2_state(State::IDLE); --- Line b 以下是原子头文件的片段: // c++ header file - atomictemplatety
我有以下代码:

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).

解决方法

复制初始化需要可访问的非显式复制或移动构造函数,因为它正式初始化来自相同类型的临时prvalue的变量.那是,

Foo a = x;

相当于:

Foo a = Foo(x);

您的类型没有可访问的复制构造函数,因此出错.相比之下,直接初始化不需要复制构造函数:

Foo a(x);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读