为什么STD :: MOVE将RVALUE参考作为参数?

发布于 2025-01-24 12:09:20 字数 589 浏览 0 评论 0原文

根据 cppreference.com move具有签名

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

为什么要进行rvalue参考t&amp;&amp; t作为灌溉?

另外,当我尝试以下代码时,

void foo(int&& bar) {
    cout << "baz" << endl;
}

int main(){
    int a;
    foo(a);
}

我从编译器“ RVALUE参考不能绑定到lvalue”中收到错误

?我很困惑。

According to cppreference.com, move has signature

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

Why does it take a rvalue reference T&& t as its arugment?

Also when I tried the following code

void foo(int&& bar) {
    cout << "baz" << endl;
}

int main(){
    int a;
    foo(a);
}

I got an error from the compiler "an rvalue reference cannot be bound to an lvalue"

What is going on? I'm so confused.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

述情 2025-01-31 12:09:20

这不是RVALUE参考,而是A 转发参考;可以保留论点的价值类别。这意味着std ::移动可以同时使用lvalue和rvalue,并无条件地将它们转换为rvalue。

转发参考是一种保留函数参数的价值类别的特殊参考文献,使得可以通过std :: forward转发它。转发引用是:

1)函数模板的功能参数,称为rvalue
引用该相同的CV UNCALIFIFIED类型模板参数
功能模板:

2)自动&amp;&amp;除了从支撑初始化列表中推导出来。

另一方面,int&amp;&amp;是RVALUE参考;请注意此处的区别,如果函数模板参数具有类型t&amp;&amp;带有模板参数t,则是推论类型t,参数是转发参考。

It's not an rvalue reference, but a forwarding reference; which could preserve the value category of the argument. That means std::move could take both lvalue and rvalue, and convert them to rvalue unconditionally.

Forwarding references are a special kind of references that preserve the value category of a function argument, making it possible to forward it by means of std::forward. Forwarding references are either:

1) function parameter of a function template declared as rvalue
reference to cv-unqualified type template parameter of that same
function template:

2) auto&& except when deduced from a brace-enclosed initializer list.

On the other hand, int&& is an rvalue reference; note the difference here, if a function template parameter has type T&& with template parameter T, i.e. a deduced type T, the parameter is a forwarding reference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文