什么是沟通 '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 ?
因为您似乎想对函数调用结果引用的对象进行更改。为此,您必须通过引用进行修改。符号用于声明引用。
写法有什么区别:
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 ?
因为您似乎想对函数调用结果引用的对象进行更改。为此,您必须通过引用进行修改。符号用于声明引用。