Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换运算符模板<;typename T>;T&&;()是否转换为右值?_C++_C++11_Language Lawyer - Fatal编程技术网

C++ 转换运算符模板<;typename T>;T&&;()是否转换为右值?

C++ 转换运算符模板<;typename T>;T&&;()是否转换为右值?,c++,c++11,language-lawyer,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&

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

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
}
struct C
{
int x;
模板
运算符T&(){
返回std::向前(x);
}
};
int main(){
cx;
int&&rv_i=std::move(x);
int rv_i2=x;
//int&rv_i3=x;//失败
}
这两个都会加上。我感到惊讶的是,它只添加了一个转换运算符,该运算符转换为类型为
T
的右值。这是标准故意的还是g++、clang++和VC++中的一个bug


因此,它再次需要重复更多的功能:(

我想你问错问题了

首先让我们讨论一下值类别角度。如果运算符返回
T&
,则调用运算符的结果为左值;如果运算符返回
T&
,则调用prvalue;如果运算符返回
T&
(),则调用xvalue

您真正想知道的是运算符返回的类型,因为它使用了看起来像通用引用的类型。但是,它不是通用引用。类型为
T&&
的函数参数将是通用引用,但这不会使类型
T&&
成为某种神奇的变色龙。这里您返回的是一个r值ref to-
T
,句点。根据上述内容,将产生一个xvalue(一种右值)


既然我们知道操作员正在做它应该做的事情,我们怎么能做不同的事情呢?这真的取决于你想要完成什么,这还没有完全说明。但很可能你正在寻找or。

FWIW,有
std::move
总是给你一个右值,而
std::forward
总是给你一个c有条件地给你一个。你有没有一个用例,这些还不够用?那甚至还没有编译。到ref的转换运算符不是直接上下文,所以不幸的是,它不是转发引用。而且标准中的区域不清楚。@swardfish,抱歉。Typo。为更完整的示例添加了其他代码。@GuillaumeRacicot,什么你的意思是“不在直接上下文中”吗?更新了问题的示例。是的,我很快发现它不是一个通用的引用。但是,由于它像参数一样位于类型推断上下文中,所以它会被当作参数来处理。@Adrian“它像参数一样位于类型推断上下文中”是吗?它怎么不是@LightnessRacesinOrbit?必须推导它转换成的类型。当我说
int&&rv_I=std::move(x);
时,编译器必须推断我试图将
x
转换成
int&
,如果不是一个参数,则以类似的方式。