T&&() 是转换为右值吗?,c++,c++11,language-lawyer"/>

首页 > 解决方案 > 转换运算符模板是否有意T&&() 是转换为右值吗?

问题描述

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

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
}

会添加两者。我很惊讶它只添加了一个转换运算符,该运算符转换为 type 的右值T。这是标准故意的还是这是 g++、clang++ 和 VC++ 中的错误?

因此,它再次需要复制更多功能。:(

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

解决方案


我想你问错问题了。

首先让我们介绍一下价值类别的角度。调用运算符的结果是一个左值(如果它返回T&),一个纯右值(如果它返回T)和一个 xvalue(如果它返回) T&&ref)。

你真正想知道的是你的操作符返回什么类型,给定看起来像通用引用的用法。但是,它不是一个通用参考。类型的函数参数T&&将是一个通用引用,但这并不能使该类型成为T&&某种神奇的变色龙。在这里,您将返回一个 rvalue-ref-to-T句点。根据上述,这会产生一个 xvalue(一种右值)。

既然我们知道运营商正在做它应该做的事情,我们怎么能做不同的事情呢?这实际上取决于您要完成的工作,但并未完全说明。但您可能正在寻找std::movestd::forward


推荐阅读