2016-04-15 52 views
6

我曾经看过一个关于汽车的类型推演规则的视频和decltype斯科特迈尔斯解释......他解释以下decltype(rvalue expr)的类型演绎规则是什么?

// 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像上面的例子? 右值表达式的decltype类型推导的规则是什么?

+1

注'的std :: move'的签名:'的std :: remove_reference_t ::类型&&移动(T &&);'它返回一个右值引用,而不是价值。 – Jarod42

+0

可能刚刚咨询过一个参考文献。Google需要十秒左右的文档。 –

回答

2

decltype有不同的特征上它是在

使用,如果表达式的值类是x值的类型,则产生decltypeŤ& &;

如果表达式的值类别是左值,则decltype得出T &;

如果表达式的值类是prvalue,然后decltype产生T.

正如你可以看到它有右值两种不同的行为。如果右值是一个x值,那么我们得到T&&,否则它是一个prvalue,我们得到T

现在,如果我们看一下std::move,我们会看到它返回xvalue,因为回报是T&&而不是T。所以std::move(x)是x值,并正确地推断为int&&