【问题标题】:Strange Move Assignment Operator Signature [duplicate]奇怪的移动赋值运算符签名[重复]
【发布时间】:2020-06-18 15:25:54
【问题描述】:

我在 Pytorch 的张量后端(ATen,source)中遇到了一个不熟悉的移动赋值运算符签名。 只是出于好奇,&& 运算符在末尾做了什么

Tensor & Tensor::operator=(Tensor && rhs) &&

虽然我熟悉移动语义以及通常的复制/移动构造函数和赋值运算符签名,但我无法在网上找到有关上述语法的任何文档。

如果有人能解释一下这个运算符的作用,它与通常的移动赋值操作有何不同,以及何时应该使用它,我将不胜感激。

【问题讨论】:

    标签: c++ pytorch rvalue-reference rvalue move-assignment-operator


    【解决方案1】:

    用作表达式的类的对象可以是右值或左值。移动赋值运算符是类的成员函数。

    此声明

    Tensor & Tensor::operator=(Tensor && rhs) &&
    

    表示为类的右值对象调用这个移动赋值操作符。

    这是一个演示程序。

    #include <iostream>
    
    struct A
    {
        A & operator =( A && ) &
        {
            std::cout << "Calling the move assignment operator for an lvalue object\n";
            return *this;
        }
    
        A & operator =( A && ) &&
        {
            std::cout << "Calling the move assignment operator for an rvalue object\n";
            return *this;
        }
    };
    
    int main() 
    {
        A a;
    
        a = A();
    
        A() = A();
    
        return 0;
    } 
    

    程序输出是

    Calling the move assignment operator for an lvalue object
    Calling the move assignment operator for an rvalue object
    

    这是在这个声明中

        a = A();
    

    赋值的左侧操作数是左值。

    在此声明中

        A() = A();
    

    赋值的左侧操作数是右值(一个临时对象)。

    【讨论】:

    • 左值和右值是表达式,而不是对象。对象可以是自动的、静态的、动态的、临时的等。没有“右值对象”之类的东西。引用限定符与表达式的值类别相关,而不是表达式指定的对象的任何属性。我提到这一点是因为该主题通常被误解,这在某种程度上是由于术语的草率使用。
    • @M.M 我的意思是表达式中使用的对象。
    猜你喜欢
    • 2017-11-21
    • 2018-09-21
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2017-04-19
    • 2015-06-23
    • 2023-04-03
    • 2020-05-16
    相关资源
    最近更新 更多