1.首先针对decltype有两种表达方法,分别是不带括号的和带括号的。
2.其次,对于这两种表达方式的区别体现在变量上:
只要是带了括号就取被推断变量的引用,不带括号就直接取被推断变量定义时的类型
3.另外,如果被推断的是函数调用,则无论是带括号还是不带括号得到的都是函数的返回类型。
4.最后,如果被推断的是运算表达式,如果表达式得到的右值,则无论是带括号还是不带括号得到的都是被推断的类型;如果表达式得到的是左值,则无论是带括号还是不带括号得到的都是被推断的引用。
具体的,2,3,4条对应的代码如下:
int n, x = 1;
const int m = 0, z = 1;
//2.
decltype(n) a; //a->int
decltype((n)) b = n; //b->int &
decltype(m) c = 1; //c->const int
decltype((m)) d = n; //d->const int &
//3.
decltype(test()) e;//e->int
decltype((test())) f;//f->int
//4.
decltype(1 + 2) g;//g->int
decltype((1 + 2)) h;//h->int
decltype(m + z) i = m;//i->int
decltype((m + z)) j = z;//j->int
decltype(x += 10) k = x;//k->int &
decltype((x += 10)) l = x;//l->int &