gpt4 book ai didi

c++ - auto&& 是做什么的?

转载 作者:IT老高 更新时间:2023-10-28 12:34:41 24 4
gpt4 key购买 nike

这是来自 Scott Meyers 的 C++11 Notes Sample 的代码,

int x;
auto&& a1 = x; // x is lvalue, so type of a1 is int&
auto&& a2 = std::move(x); // std::move(x) is rvalue, so type of a2 is int&&

我无法理解 auto&&
我对 auto 有一些了解,从中我会说 auto& a1 = x 应该将 a1 的类型设为 int&

引用的代码中的哪个似乎是错误的。

我写了这个小代码,并在 gcc 下运行。

#include <iostream>

using namespace std;

int main()
{
int x = 4;
auto& a1 = x; //line 8
cout << a1 << endl;
++a1;
cout << x;
return 0;
}

输出 = 4(换行符)5
然后我将第 8 行修改为 auto&& a1 = x;,然后运行。相同的输出。

我的问题:auto& 是否等于 auto&&
如果它们不同,auto&& 会做什么?

最佳答案

代码是正确的。 auto&& p = expr 表示 p 的类型是 T&& 其中 T 将从 expr。这里的 && 表示右值引用,例如

auto&& p = 1;

会推断出T == int,因此p的类型是int&&

但是,引用可以根据规则折叠:

T& &   == T&
T& && == T&
T&& & == T&
T&& && == T&&

(该特性用于在C++11中实现完美转发。)

在这种情况下

auto&& p = x;

因为 x 是一个左值,不能绑定(bind)右值引用,但是如果我们推断 T = int& 那么 p 的类型> 会变成int& && = int&,这是一个左值引用,可以绑定(bind)到x。只有在这种情况下 auto&&auto& 给出相同的结果。这两个是不同的,例如

auto& p = std::move(x);

不正确,因为std::move(x)是一个右值,左值引用不能绑定(bind)到它。

请阅读 C++ Rvalue References Explained 走一走。

关于c++ - auto&& 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162808/

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