奇怪的移动分配操作员签名
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();
赋值的左手操作数是右值(一个临时对象)。
我在 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();
赋值的左手操作数是右值(一个临时对象)。