转换运算符template <typename t =“”> T &&()是否故意转换为右值?

时间:2019-05-02 12:22:14

标签: c++ c++11 language-lawyer

我正在编写一个转换运算符,该运算符将一个类转换为左值或右值。所以我认为:

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 ++中的错误?

因此,这又需要重复更多的功能。 :(

1 个答案:

答案 0 :(得分:3)

我认为您是在问错问题。

首先让我们介绍价值类别角度。调用运算符的结果是,如果返回T&,则为左值;如果返回T,则为prvalue;如果返回T&&ref),则为xvalue。

考虑到通用引用的用法,您真正想知道的是运算符返回的类型。但是,这不是通用参考。类型为T&&的函数自变量将是通用引用,但这不会使类型T&&成为某种神奇的变色龙。在这里,您将返回右值引用T。根据以上所述,将产生xvalue(一种rvalue)。

现在我们知道操作员正在做应做的事情,我们该如何做不同的事情?这确实取决于您要完成的工作,但尚未完全说明。但是您可能正在寻找std::movestd::forward