什么是沟通 'auto my_var =' 与 'auto& my_var ='?

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

写法有什么区别:

auto my_var = [expression];

auto& my_var = [expression];

A) 正在传达什么?

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

C) 你应该什么时候使用第二个 'auto&' ?

更新:

一个例子是当表达式求值为引用时:

#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
}

乍一看这似乎并不直观(但如果您尝试从更广泛的角度来看,它是有道理的)。对于 'fix',我们需要使用 auto& 版本,- 但为什么会这样呢?

What is being communicated ?

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

is the first version guareenteed to be a copy ?

它保证是一个独特的对象。

但不保证一定能复制。那要看表情了。如果它是一个纯右值,那么从 C++17 开始就不会有副本;变量将直接由表达式初始化。否则,就抽象机而言,存在一个副本(如果类型具有移动构造函数并且表达式是一个 xvalue 或如果它是 C++17 之前的纯右值,则存在一个副本)。但在某些情况下,在实践中可能会省略该复制/移动。

一个展示没有任何复制的例子。以下程序在 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();
}

when should you use the second 'auto&' ?

当你想声明一个左值引用时。示例:

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

we need to use auto& version, -but why is that exactly ?

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