写作之间有什么区别
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&
版本,-,但是为什么呢?
答案 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
我们需要使用自动版本,-但是为什么会这样?
因为似乎您想对函数调用结果所引用的对象进行更改。为此,您必须通过参考进行修改。 &符号用于声明引用。