您的问题标题指定“表现”。
auto 是一个编译时构造,它允许将自身替换为推导类型。它的使用不会产生不同的机器指令,而不是你手写它推导出的类型名。
问题在于,在管理性能时,类型规范和强制转换通常是至关重要的,auto 可以隐藏领先的程序员说出与他们本意不同的内容:
std::vector<std::array<BigStruct, 10000>>& f();
auto va = f(); // copy
for (auto v: va) { // copies
// ...
}
如果程序员写过:
std::vector<std::array<BigStruct, 10000>> va = f();
或
for (std::array<BigStruct, 10000> v : va)
他们会意识到他们是按值指定的。但是std::array<BigStruct, 10000> 是auto 在这里推导出的,在这些情况下,它转化为按值。
人们放下了警惕,忘记了auto 推断出 type,它不包括 ref 限定。
auto& va = f(); // reference
for (auto& v : va) { // references
这里有性能影响,但不是由auto 引起的,而是(意外)显式指定副本的副作用。
auto 不代表 the same as this,而是代表 an instance of this。
auto va = f(); // an instance-of what f returns, thus a copy.
auto& va = f(); // a reference to an instance-of, thus by reference.