【问题标题】:What does it means user-declared for Implicitly-declared move assignment operator?对于隐式声明的移动赋值运算符,用户声明是什么意思?
【发布时间】:2018-10-13 10:58:36
【问题描述】:

声明

隐式声明的移动赋值运算符

如果没有为类提供用户定义的移动赋值运算符 类型(结构、类或联合),并且以下所有条件都为真:

没有用户声明的复制构造函数;
没有用户声明的移动构造函数;
没有用户声明的复制赋值运算符;
没有用户声明的析构函数;

带有用户声明的复制赋值运算符是否意味着只有

类名 & 类名 :: operator= ( 类名 && )

任何 operator=()已定义?

例子:

class Bar
{
public:
   Bar() = default;
   SomeClass some;
};

class Foo
{
public:
   Foo() = default;

   Foo& operator=(Bar&& bar) : some(std::move(bar.some))
   {
   }

   SomeClass some;
};

这是否符合隐式声明的移动赋值运算符的条件?

隐式声明的移动构造函数也是如此。

【问题讨论】:

    标签: c++11 move-semantics move-assignment-operator


    【解决方案1】:

    请注意,它说的是“用户声明的 copy 赋值运算符”(强调我的)。并非每个赋值运算符都是复制赋值运算符。

    对于X 类,copy 赋值运算符定义为operator=,它采用XX&const X&volatile X& 或@ 类型的参数987654327@。所以你的Foo::operator=(Bar&&) 不是一个 copy 赋值运算符,因此不会影响移动(或复制)赋值运算符的隐式声明。

    【讨论】:

    • 所以它必须匹配class_name & class_name :: operator= ( class_name && ) 语法。我不太确定,谢谢。
    • @Moia 好吧,不完全是。首先,这将是一个 move 赋值运算符,而不是一个 copy 运算符。其次,返回类型不影响某物是否是复制/移动赋值运算符;只有参数类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多