decltype(1 + 2)是否声明了xvalue或prvalue?
cppreference说,decltype(表达式)将声明: T&&如果表达式是xvalue 2.如果表达式是prvalue,则为T. T&如果表达式是左值
但我的问题是:如何生成一个xvalue的表达式?我想返回值和临时对象应该是xvalue,但实际上它们似乎是xvalue,在我的实验中:
struct S{};
S f();
int main()
{
int i=2;
decltype(i+1) j=i;
++j;
printf("i=%d\n",i);
S obj;
decltype(f()) k=obj;
return 0;
}
这个程序编译:我可以判断
decltype(i + 1)将(i + 1)声明为prvalue
因为如果它是一个x值,那么decltype得到T&&,它不能绑定到" i"的左值变量。 decltype(f())也给我f()作为prvalue也很奇怪?
所以我的问题是:如何编写一个表达式,以便decltype(表达式)给我一个xvalue? 谢谢。
答案 0 :(得分:5)
Decltype解析为一个类型,而不是一个表达式 - 你不能说它"声明一个prvalue"或类似的东西。
i+1
是一个prvalue,而不是id-expression。因此decltype
会产生非引用类型:decltype(i+1) j = i;
表示int j = i;
。
第二种情况类似; f()
是prvalue,因此decltype(f())
为S
。
要使decltype(expression)
解析为右值引用类型,表达式必须是xvalue。例如,decltype( std::move(f()) )
为S&&
。
答案 1 :(得分:3)
假设T
不是引用类型。然后:
T f();
,类型decltype(f())
为T
。T& f();
,类型decltype(f())
为T&
。T&& f();
,类型decltype(f())
为T&&
。因此,让decltype
生成右值引用的方法是将其应用于xvalue表达式,例如std::move(1 + 2)
。