我已经观看了Scott Meyers解释的有关auto和decltype的类型推导规则的视频...他解释了以下内容

// decltype(lvalue expr) => reference to the type of the expression
// decltype(lvalue name) => type of the name

我了解这些规则...但是他没有解释以下内容
// decltype(rvlaue expr) => ???

所以我尝试通过练习来理解它,所以我做了以下事情
int x = 8;
int func();  // calling this function is rvlaue expr ...

decltype(32) t1 = 128;    // Ok   t1 is int
decltype(64) t2 = x;      // Ok   t2 is int
decltype(func()) t3 = x;  // Ok   t3 is int ... obviously

现在魔术
decltype(std::move(x)) t4 = x;  // Error t4 is int&& ... compiler says

std::move(x)不是右值表达式吗?为什么不使用decltype将t4推导为int &&,而不仅仅是像上面的示例那样将int推导为int?
右值表达式的decltype类型推导的规则是什么?

最佳答案

decltype 的行为因所使用的类型而异

如您所见,它对右值有两种不同的行为。如果rvalue是xvalue,则得到T&&,否则它是prvalue,我们得到T
现在,如果我们查看 std::move ,它会返回xvalue,因为返回的是T&&而不是T。因此std::move(x)是一个xvalue,可以正确推导为int&&

关于c++ - decltype(rvalue expr)的类型推导规则是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36647330/

10-10 14:47