2

decltype(1+2) 是否声明了 xvalue 或 prvalue?

cppreference 说,decltype(expression) 将声明: 1. T&& 如果表达式是 xvalue 2. T 如果表达式是纯右值 3. 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) 声明为纯右值

因为如果它是一个 xvalue,那么 decltype 会得到 T&&,它不能绑定到“i”的左值变量。decltype(f()) 也给我 f() 作为prvalue也很奇怪?

所以我的问题是:如何编写一个表达式,以便 decltype(expression) 给我一个 xvalue?谢谢。

4

2 回答 2

5

Decltype 解析为一个类型,而不是一个表达式——你不能说它“声明了一个纯右值”或类似的东西。

i+1是prvalue,而不是id-expression。所以decltype产生一个非引用类型:decltype(i+1) j = i;表示int j = i;.

第二种情况类似;f()是纯右值,decltype(f())也是S

decltype(expression)解析为右值引用类型,表达式必须是 xvalue。例如decltype( std::move(f()) )S&&.

于 2017-04-17T02:05:14.490 回答
3

假设这T不是引用类型。然后:

  • 对于T f();,类型decltype(f())T
  • 对于T& f();,类型decltype(f())T&
  • 对于T&& f();,类型decltype(f())T&&

因此decltype,生成右值引用的方法是将其应用于 xvalue 表达式,例如std::move(1 + 2).

于 2017-04-17T02:05:59.943 回答