返回左值的函数,总是返回左值引用

use*_*404 7 c++

Scott meyers 在 Effective C++ 的第 3 项中说

将 decltype 应用于名称会产生该名称的声明类型。名称通常是左值表达式,但这不会影响 decltype 的行为。然而,对于比名称更复杂的左值表达式,decltype 通常确保报告的类型是左值引用。也就是说,如果除名称之外的左值表达式具有类型 T,则 decltype 将该类型报告为 T&。这很少有任何影响,因为大多数左值表达式的类型固有地包含左值引用限定符。例如,返回左值的函数总是返回左值引用。

他说的函数返回左值,例如,总是返回左值引用是什么意思

Ast*_*ngs 3

这就是它所说的意思!

\n

无法创建一个函数,使其返回类型不是T&,但调用它会产生左值表达式。

\n

所有其他返回类型都会导致函数调用成为右值表达式。

\n

当您认为“返回”已存在的内容的唯一方法是通过引用 \xe2\x80\x94 时,这是直观的,否则函数调用的结果始终是“临时”,无论是因为它正在复制某些局部变量,或者因为它是从某个局部变量移动的。

\n

此规则的可能例外,返回T&&,也不适用,因为它们会生成右值表达式(这就是移动语义发挥作用的原因,因为只有右值表达式可以继续绑定到T&&参数)。

\n

斯科特正在报告该语言规则的一个结果,并告诉我们相同的结果被用作 的规则之一的理由decltype

\n

可以说,他可以这样更清楚地表述:

\n
\n

调用计算结果为左值的唯一函数是那些返回左值引用的函数。

\n
\n