C++ 为什么在这段代码中使用auto和int给出不同的答案?

C++ 为什么在这段代码中使用auto和int给出不同的答案?,c++,c++11,C++,C++11,我给两个变量赋值10。当我使用“int”对其中一个变量使用ref()时,我得到一个不同的值,当我使用“auto”时,我得到一个不同的值 Using auto int foo(10); auto bar = std::ref(foo); ++bar; cout << foo << endl; std::cout << bar << endl << endl; Output: 11

我给两个变量赋值10。当我使用“int”对其中一个变量使用ref()时,我得到一个不同的值,当我使用“auto”时,我得到一个不同的值

Using auto

     int foo(10);
     auto bar = std::ref(foo);
     ++bar; 
     cout << foo << endl;
     std::cout << bar << endl << endl;

Output: 11
        11
使用自动
int foo(10);
自动条=标准::参考(foo);
++酒吧;
cout该函数创建一个对象。此对象包装对
foo
的引用

您基本上(以间接方式)创建了对
foo
的引用,在第一个示例中,对
bar
的所有修改都将被修改为
foo
。相当于

std::reference_wrapper<int> bar = std::ref(foo);
在第二个示例中,您还创建了这样一个引用包装器对象,但随后获取其值并将其复制到变量
jar
中。然后,将销毁引用包装器对象。对
jar
的所有修改仅对变量
jar
本身进行,而不是对
foo

进行修改。函数将创建一个对象。此对象包装对
foo
的引用

您基本上(以间接方式)创建了对
foo
的引用,在第一个示例中,对
bar
的所有修改都将被修改为
foo
。相当于

std::reference_wrapper<int> bar = std::ref(foo);
在第二个示例中,您还创建了这样一个引用包装器对象,但随后获取其值并将其复制到变量
jar
中。然后,将销毁引用包装器对象。对
jar
的所有修改只对变量
jar
本身进行,而不是对
foo

进行。实用程序返回类型为的对象

因此,在您的示例中:

auto bar = std::ref(foo);
bar
的类型正好是
std::reference\u wrapper
。简而言之,它将作为一个引用,因此语句的效果
++bar将增加引用变量的值(即,
foo

另一方面,在声明中:

int jar = std::ref(boo);
jar
作为类型
int
注意:这不是一个引用,而是一个名为
jar
的全新变量。当您递增
jar
时,这不会影响其他变量(
foo


附加注释

为了完整起见,语句
intjar=std::ref(boo)隐藏隐式强制转换。实际上,可以将对象
std::reference\u包装器
隐式转换为
T&

实用程序返回类型为的对象

因此,在您的示例中:

auto bar = std::ref(foo);
bar
的类型正好是
std::reference\u wrapper
。简而言之,它将作为一个引用,因此语句的效果
++bar将增加引用变量的值(即,
foo

另一方面,在声明中:

int jar = std::ref(boo);
jar
作为类型
int
注意:这不是一个引用,而是一个名为
jar
的全新变量。当您递增
jar
时,这不会影响其他变量(
foo


附加注释


为了完整起见,语句
intjar=std::ref(boo)隐藏隐式强制转换。实际上,对象
std::reference\u包装器可以隐式地转换为
T&

这是因为auto吗?因为使用的概念是相同的,对吗?是因为汽车吗?因为所使用的概念是相同的,对吗?