什么是'auto my_var ='与"自动my_var="的沟通?

What is communicating 'auto my_var =' vs. 'auto& my_var ='?

本文关键字:my var 什么 auto 自动      更新时间:2023-10-16

写作有什么区别:

auto my_var = [expression];

auto& my_var = [expression];

A( 正在传达什么?

B( 第一个版本保证是副本吗?(什么时候,什么时候不?

C( 什么时候应该使用第二个"自动&"?

更新:

一个例子是当表达式计算为引用时:

#include <vector>
int main() {
auto  ints = std::vector{-1};
auto front_int = ints.front();//front returns a reference, but 'auto' doesn't reflect that (giving us a copy instead)
front_int = 0;
return ints.front();//returns '-1', we didn't update the vector
}

乍一看,这似乎并不直观(而如果您尝试从更广泛的角度看,这是有道理的(。要"修复",我们需要使用auto&版本,但究竟是为什么呢?

正在传达什么?

正在传达my_var的类型。my_var是正在声明的变量。更具体地说,与号(或缺少与号(传达类型是否为引用。

第一个版本是保证是副本吗?

它保证是一个不同的对象。

但是,不能保证复制。这取决于表达式。如果是 prvalue,那么自 C++17 年以来就不会有副本;变量将由表达式直接初始化。否则,就抽象机器而言,存在副本(如果类型具有移动构造函数并且表达式是 xvalue 或如果它是 C++17( 之前的 prvalue,则存在 move(。但在某些情况下,这种复制/移动在实践中可能会被省略。

演示缺少任何复制的示例。以下程序在 C++17 中格式良好:

struct not_opyable_nor_movable {
not_opyable_nor_movable()                          = default;
not_opyable_nor_movable(not_opyable_nor_movable&)  = delete;
not_opyable_nor_movable(not_opyable_nor_movable&&) = delete;
};
not_opyable_nor_movable function() {
return {};
}
int main() {
auto my_var = function();
}

什么时候应该使用第二个"自动"?

当您要声明左值引用时。例:

int foo{};
auto& myvar = foo;
myvar = 42; // foo is now 42

我们需要使用自动版本,但为什么会这样呢?

因为您似乎想要对函数调用结果所引用的对象进行更改。为此,您必须通过引用进行修改。与号用于声明引用。