"struct atomic"的复制构造函数
Copy constructor of "struct atomic"
我有以下代码:
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中的复制构造函数,因此出现了错误消息"使用已删除的函数"(我理解)
有人能帮我理解为什么Linea最终会调用Linec(而不是Line1d)吗。
Foo a = x;
相当于:
Foo a = Foo(x);
您的类型没有可访问的复制构造函数,因此出现错误。相比之下,直接初始化不需要复制构造函数:
Foo a(x);
这是直接初始化和复制初始化之间的区别。让我们概括一下:
A a1 = b;
A a2(b);
如果b
的类型是A
,则这两条线是相同的。它们都将调用A
的复制构造函数。
然而,如果b
的类型不同于A
,则它们的语义也不同。a2
通过直接初始化来初始化,调用A
的适当构造函数,该构造函数采用b
的类型。
另一方面,a1
是通过复制初始化来初始化的,的作用是"从参数初始化一个临时对象,然后使用复制构造函数将该临时对象复制到最终对象中。"因此,在这种情况下,复制初始化等效于:
A a1(A(b));
在您的情况下,这将失败,因为复制构造函数已被删除,并且没有移动构造函数。
为了完全回答您的第二个问题,它不调用Linec而不是Lined,而是除了Lined之外的
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类