我们应该总是使用汽车和&&对于局部变量

时间:2014-04-26 08:32:13

标签: c++ c++11 auto

在阅读了这个帖子auto&&之后,当我们声明一个局部变量来捕获一个函数的返回类型时,它是否应该总是使用auto&&而不是auto保留函数返回的类型)?

用例可以是例如

auto&& result = func_returning_lvalue_or_lvalue_reference();

auto&& iterator = vector_.begin();

或其他任何内容。

换句话说,拥有大量auto&&的基本代码是正常的吗?

2 个答案:

答案 0 :(得分:6)

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

例如:

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

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

答案 1 :(得分:3)

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

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

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