我们是否应该始终使用 auto&&&for 局部变量

Should we always use auto&& for local variable

本文关键字:auto for 局部变量 是否 我们      更新时间:2023-10-16

在阅读了这个线程auto&&之后,这是否意味着当我们声明一个局部变量来捕获函数的返回类型(以准确地保留函数返回的类型)时,我们应该始终使用auto&&而不是auto

用例可以是例如

auto&& result = func_returning_lvalue_or_lvalue_reference();

auto&& iterator = vector_.begin();

或其他任何东西。

换句话说,有一个包含大量auto&&的基本代码是正常的?

您不应该一直使用auto&&。特别是,如果你需要一份副本,你不应该使用它。使用auto&&,您可能会得到一个副本(作为对临时对象的引用),也可能只得到对原始对象的引用。

例如:

auto&& name = customer.get_name(); // std::string or const std::string&
name.erase(name.find(' '));

这段代码能编译吗?如果它进行编译,它会更改客户的名称,还是只对临时对象起作用?如果不看函数get_name()的签名,就无法判断。

它有时会导致未定义的行为。

void f()
{
    string a{"a"};
    string b{"b"};
    auto&& c = move(a+b);
    ...
}

c将比a+b产生的临时寿命长。还有其他方法可以解决这个问题。