在阅读了这个帖子auto&&
之后,当我们声明一个局部变量来捕获一个函数的返回类型时,它是否应该总是使用auto&&
而不是auto
保留函数返回的类型)?
用例可以是例如
auto&& result = func_returning_lvalue_or_lvalue_reference();
或
auto&& iterator = vector_.begin();
或其他任何内容。
换句话说,拥有大量auto&&
的基本代码是正常的吗?
答案 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产生的临时寿命更长。还有其他方法可以解决这个问题。