写之间有什么区别:
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&版本,但是为什么要这样呢?
正在传达什么?
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&版本,但是为什么会这样呢?
因为似乎您想对函数调用结果所引用的对象进行更改。为此,您必须通过参考进行修改。“与”号用于声明引用。