什么是'auto my_var ='与"自动my_var="的沟通?
What is communicating 'auto my_var =' vs. 'auto& my_var ='?
写作有什么区别:
auto my_var = [expression];
和
auto& my_var = [expression];
A( 正在传达什么?
B( 第一个版本保证是副本吗?(什么时候,什么时候不?
C( 什么时候应该使用第二个"自动&"?
更新:
一个例子是当表达式计算为引用时:
#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&
版本,但究竟是为什么呢?
正在传达什么?
正在传达my_var
的类型。my_var
是正在声明的变量。更具体地说,与号(或缺少与号(传达类型是否为引用。
第一个版本是保证是副本吗?
它保证是一个不同的对象。
但是,不能保证复制。这取决于表达式。如果是 prvalue,那么自 C++17 年以来就不会有副本;变量将由表达式直接初始化。否则,就抽象机器而言,存在副本(如果类型具有移动构造函数并且表达式是 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();
}
什么时候应该使用第二个"自动"?
当您要声明左值引用时。例:
int foo{};
auto& myvar = foo;
myvar = 42; // foo is now 42
我们需要使用自动版本,但为什么会这样呢?
因为您似乎想要对函数调用结果所引用的对象进行更改。为此,您必须通过引用进行修改。与号用于声明引用。
相关文章:
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- ( var > x) 和 ( x < var)之间有什么区别吗?
- 在反转字符串'my.name.is'时,我得到的输出为"is@.name.my"。我不明白'@'是从哪里来的
- My Project的属性配置正确,但Visual Studio仍然无法打开包含头文件
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- FileIO,写入文档,var = 1.0 变为 1
- 解释一下这个宏是如何工作的?[C 中的打印var名称]
- 与现有VAR无法实现结构化结合
- 范围分辨率运算符在类型:: var的情况下返回什么
- 为什么在 var 未更新的情况下使用,仅在启动 var 后打印
- var 已更改为 1,并带有 "if (var = 0 || var == 0)" 语句
- VAR在其自己的初始化器中使用
- 在哪里放置pthread Mutex和con var,以确保激活所有功能
- C++ "var foo = !!::bar()"语法?
- 连接从 QML 到 Qt 的信号:var 到 QList<QString>
- 具有挑战性的数据文件格式,需要将其读取为包含类对象的数组的VAR
- `type *var =(int)0`,法律与否
- 声明为无效的变量或字段'name of var'
- 仅限 Xcode 9 - 如何解决由类模板中的静态变量引起的 [-Wundefined-var-template] 警告
- 如何在类中进行 c++ 多线程处理(将线程引用保留为成员 var)