奇怪的移动分配操作员签名

Strange Move Assignment Operator Signature

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

末尾做了什么
Tensor & Tensor::operator=(Tensor && rhs) &&

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

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

用作表达式的 class 的对象可以是右值或左值。移动赋值运算符是 class.

的成员函数

这个声明

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

表示为 class 的右值对象调用此移动赋值运算符。

这是一个演示程序。

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

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