gpt4 book ai didi

c++ - 为什么右值引用变量不是右值?

转载 作者:可可西里 更新时间:2023-11-01 16:27:22 25 4
gpt4 key购买 nike

假设我有一个函数的两个重载 f

void f(T&&); // #1
void f(T&); // #2

然后在另一个函数体中g

void g(T&& t) 
{
f(t); // calls #2
}

过载 f(T&)将被调用,因为 t被认为是左值。

这让我很惊讶。如何使用签名函数 f(T&&)无法匹配类型为 T&& 的调用?更让我惊讶的是,一个电话f(static_cast<T&&>(t))实际上会调用右值重载 f(T&&) .

使这成为可能的 C++ 规则是什么?是T&&不仅仅是一种类型?

最佳答案

自动被视为右值的东西是没有名字的东西,并且(很快)将没有名字的东西(在返回值的情况下)。

T&& t有一个名字,它是t .

右值之所以是那些东西,是因为那个使用点之后引用它们几乎是不可能的。

T&&是类型右值引用。右值引用只能绑定(bind)到右值(不涉及 static_cast),但它是右值引用类型的左值。

它是右值引用类型的事实只在它的构造过程中很重要,如果你这样做了 decltype(variable_name) .否则它只是引用类型的另一个左值。

std::move(t)return static_cast<T&&>(t);并返回一个右值引用。

管理它的规则是用 C++ 标准中的标准语言编写的。复制/粘贴它们不会那么有用,因为它们不是那么容易理解。

第一个一般规则是,当你从函数返回一个命名值,或者当一个值没有名称,或者当一个函数显式返回时,你会得到一个隐式移动(也就是绑定(bind)到右值引用参数的参数)右值引用。

其次,只有右值引用和const&可以绑定(bind)到右值。

第三,当直接绑定(bind)到构造函数外部的引用时,会发生临时值的引用生命周期延长。 (因为只有右值引用和 const& 可以直接绑定(bind)到临时对象,所以这只适用于它们)

第四,T&&并不总是右值引用。如果T类型为 X&X const& ,然后引用折叠转弯 T&&进入X&X const& .

最后,T&&在类型推导上下文中将推导 T作为X , X& , X const&X const&&取决于参数的类型,因此可以充当“转发引用”。

关于c++ - 为什么右值引用变量不是右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32620750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com