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

时间:2019-09-23 11:56:00

标签: c++ c++17 auto

写作之间有什么区别

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
}

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

1 个答案:

答案 0 :(得分: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();
}
  

何时应使用第二个“ auto&”?

要声明左值引用时。示例:

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

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

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