C ++ 11:" decltype(1 + 2)"声明xvalue或prvalue?

时间:2017-04-17 02:01:02

标签: c++ c++11 decltype xvalue prvalue

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? 谢谢。

2 个答案:

答案 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)