什么在传达“ auto my_var =”与“ auto&my_var =”?

dar*_*une 1 c++ auto c++17

写之间有什么区别:

auto my_var = [expression];
Run Code Online (Sandbox Code Playgroud)

auto& my_var = [expression];
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

乍一看似乎不直观(但是如果您尝试查看更广阔的前景,这是有道理的)。要“修复”,我们需要使用auto&版本,但是为什么要这样呢?

eer*_*ika 5

正在传达什么?

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

确保第一个版本是副本?

保证是一个独特的对象。

但是,不能保证复制。那取决于表情。如果它是一个prvalue,那么从C ++ 17开始将没有副本。该变量将直接由表达式初始化。否则,就抽象机器而言,存在一个副本(如果类型具有move构造函数且表达式是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();
}
Run Code Online (Sandbox Code Playgroud)

什么时候应该使用第二个“ auto&”?

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

int foo{};
auto& myvar = foo;
myvar = 42; // foo is now 42
Run Code Online (Sandbox Code Playgroud)

我们需要使用auto&版本,但是为什么会这样呢?

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