C++中对右值应用decltype是否总是得到指针?含相关示例疑问
关于C++中decltype与右值表达式的疑问解答
嘿,这个问题得拆成几个关键部分来理,先澄清几个容易混淆的概念,再逐个解答你的疑问:
首先纠正一个核心误解:引用本身不是右值
你提到“既然引用属于右值”,这里其实搞错了——引用是变量的别名,本身不属于值类别(左值/右值)。左值引用(T&)用来绑定左值,右值引用(T&&)用来绑定右值,但引用本身不是值,只是对某个值的引用方式。
比如你说的decltype(*p)得到int&,本质是因为*p这个解引用表达式是左值(你可以写*p = 10;这种赋值操作),根据decltype的规则,当表达式是左值时,decltype会返回对应的左值引用类型。
对右值表达式应用decltype,绝对不会“总是得到指针类型”
decltype的结果取决于表达式的实际类型和值类别,和它是左值还是右值没有必然的“指针类型”绑定关系。举几个直观的例子:
decltype(3 + 5):3+5是右值表达式,结果类型是int,完全和指针无关decltype(std::string("test")):这个临时字符串是右值,decltype返回std::string,不是指针decltype(std::move(ptr)):如果ptr是int*类型,std::move(ptr)会把它转换成右值,decltype返回int*&&(指针的右值引用),也不是单纯的指针类型- 只有像
&p这种本身就返回指针的表达式(它是右值),decltype才会返回指针类型(int**),但这是因为取地址操作的结果本身就是指针,不是因为它是右值。
再梳理你提到的两个decltype案例
decltype(*p):解引用表达式*p是左值(可以被赋值),所以decltype返回左值引用int&,这和右值没关系decltype(&p):取地址表达式&p是右值(不能被赋值),它的类型本身就是int**,所以decltype直接返回这个类型——这里只是巧合是指针,不是所有右值表达式的decltype结果都是指针。
总结一下:decltype的结果完全由表达式自身的类型和值类别决定,右值表达式的decltype结果可以是任意类型(基本类型、类类型、右值引用、指针等),不存在“总是得到指针类型”的规则。
内容的提问来源于stack exchange,提问作者Jake Wright
相关产品推荐
相关产品推荐

