c++ - "struct atomic"的复制构造函数

标签 c++ templates c++11

我有以下代码:

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/

相关文章:

java - 从 C++ 应用程序从 Java 调用 C++ 时,如何避免 UnsatisfiedLinkError?

java - OpenCV Mat 处理 Android JNI

c++ - 是否有必要在模板函数中转换文字常量?

c++ - 使用自定义构造函数作为模板函数

c++ - SDL 应用程序无法在其他计算机上运行

c++ - 霍夫曼码编码遍历

c++ - 默认与推导的模板参数?

c++ - 在具有结构的 vector 中获取项目位置

c++ - c++11 中任意大小整数的最低 31 位

c++ - 为什么我的右值重载下标运算符没有被调用