请看 C++ Primer 中的介绍。“如果表达式的内容是解引用,则 decltype 将得到引用类型。” 书中说的很明确。但是我不能理解。如果有:
int i = 42;
int * p;
p=&i;
那么 k= * p; //k 中存储整型的 42
解引用”释放“的数据是其指向的内存中所存储的数据,如果存储的是 int ,那么解引用后释放的就是 int 类型 。如果指针 p 目标内存中存储的是字符串,那么解引用后返回字符串。那么 decltype 捕获的应该是字符串类型。这样才比较”合理“。书中的意思很明确。但是我不理解。请问应该如何理解“如果表达式的内容是解引用,则 decltype 将得到引用类型。”
1
codehz 312 天前
因为 c++有引用的概念,所以可以用引用来表达返回左值的类型,而*p 作为表达式是左值表达式,decltype 对左值表达式使用时,返回引用用来区分其他值类别
|
2
exch4nge 312 天前
虽然我也没了解透彻,尝试强行回答下,参考 https://en.cppreference.com/w/cpp/language/decltype 里
*p 是一个表达式,符合第二种 decltype ( expression ) ,第二种分成下面三种情况 a) if the value category of expression is xvalue, then decltype yields T&&; b) if the value category of expression is lvalue, then decltype yields T&; c) if the value category of expression is prvalue, then decltype yields T. 然后 *p 属于 lvalue ,所以是引用。参考 https://en.cppreference.com/w/cpp/language/value_category |
3
huzhikuizainali OP @exch4nge 感谢你提供的参考链接。基本上可以认为“就是这么规定的”是吧。如果是这样。那也就不需要进一步去“理解了”
按照他的第三条规定,那么 decltype(*p+1) 返回的就是 int 类型,对吧? |
4
RollingTruck 312 天前
似乎 decltype 的返回值, 根据参数不同, 有两种含义,
第一种含义是值的类型, 这也是符合直觉的含义, 第二种含义是判断 lvalue, rvalue, xvalue, 也许拆分成 2 个函数更好? |
5
cybort 312 天前 via Android
在没有明确指示的情况下,优先使用引用方式而非传值,这样性能较好。
|