为什么右值引用变量不是右值?
让我们考虑两个重载函数 f:
void f(T&&); // Overload #1 void f(T&); // Overload #2
内功能g:
void g(T&& t) { f(t); // Calls Overload #2 }
令人惊讶的是,由于 t 被视为左值,因此调用了重载 #2,尽管第一个重载具有右值引用签名 (T&&)。
如何右值引用签名无法匹配传递右值的调用?
理解 C 规则右值
右值通常是没有名称的变量,很快就会失去名称。 T&& t 具有标识符 t,因此它是一个左值。这是有道理的,因为右值应该是短暂的并且以后不可能引用。
但是,T&& 是类型右值引用。它只能绑定到右值而不涉及静态强制转换,但它仍然是右值引用类型的左值。它的右值引用性质仅在其初始化和 decltype 使用期间重要。否则,它充当引用类型的左值。
静态转换和引用扩展
std::move(t) 通过执行静态转换返回右值引用在t。这允许临时值在绑定到构造函数外部的引用时具有引用生命周期扩展。
C 标准定义了处理这些场景的显式规则。右值引用和常量引用可以绑定到右值。当从函数返回命名值、值没有名称或函数显式返回右值引用时,会发生隐式移动。
此外,T&& 可能并不总是右值引用。如果T是X&或 X const&,引用折叠转换 T&&到X&或 X const&。最后,T&&可以充当类型推导中的“转发引用”,具体取决于参数的类型。
以上是为什么右值引用变量与右值引用函数签名不匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!