我正在编写一个转换运算符,该运算符将一个类转换为左值或右值。所以我认为:
struct C
{
int x;
template<typename T>
operator T&&() {
return std::forward<T>(x);
}
};
int main() {
C x;
int&& rv_i = std::move(x);
int rv_i2 = x;
//int& rv_i3 = x; // fails
}
将两者都添加。令我惊讶的是,它只添加了一个转换运算符,该运算符转换为T
类型的右值。这是出于标准的目的,还是g ++,clang ++和VC ++中的错误?
因此,这又需要重复更多的功能。 :(
答案 0 :(得分:3)
我认为您是在问错问题。
首先让我们介绍价值类别角度。调用运算符的结果是,如果返回T&
,则为左值;如果返回T
,则为prvalue;如果返回T&&
(ref),则为xvalue。>
考虑到通用引用的用法,您真正想知道的是运算符返回的类型。但是,这不是通用参考。类型为T&&
的函数自变量将是通用引用,但这不会使类型T&&
成为某种神奇的变色龙。在这里,您将返回右值引用T
。根据以上所述,将产生xvalue(一种rvalue)。
现在我们知道操作员正在做应做的事情,我们该如何做不同的事情?这确实取决于您要完成的工作,但尚未完全说明。但是您可能正在寻找std::move
或std::forward
。