2

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

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

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

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

4

1 回答 1

4

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

本声明

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();

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

于 2020-03-05T22:24:26.357 回答