decltype
以两种不同的方式工作;当与未绑定的id表达式一起使用时,它会产生声明它的确切类型(在案例1中
std::string
)。否则,
如果参数是t类型的任何其他表达式,并且
a)如果表达式的值类别是xvalue,则decltype将生成
T&公司
b)如果表达式的值类别是左值,则decltype将生成
T&
c)如果表达式的值类别是prvalue,则decltype
产量t。
和
注意,如果对象的名称用括号括起来,则将其视为普通的左值表达式,因此
decltype(x)
和
decltype((x))
通常是不同的类型。
(str)
是一个带圆括号的表达式,它是左值;然后它生成
string&
. 所以返回一个对局部变量的引用,它总是被挂起的。它的解引用导致ub。