C++ 我们是否应该始终使用auto&&;对于局部变量
阅读此线程后,这是否意味着在声明局部变量以捕获函数的返回类型(精确保留函数返回的类型)时,应该始终使用C++ 我们是否应该始终使用auto&&;对于局部变量,c++,c++11,auto,C++,C++11,Auto,阅读此线程后,这是否意味着在声明局部变量以捕获函数的返回类型(精确保留函数返回的类型)时,应该始终使用auto&&而不是auto 例如,用例可以是 auto&& result = func_returning_lvalue_or_lvalue_reference(); 或 或者别的什么 换句话说,基本代码中包含大量的自动和&?否是正常的。您不应该一直使用自动和&。特别是,如果你需要一份副本,就不应该使用它。使用auto&&可以获得副本(作为对临时对象的引用),也可以只获得对原始
auto&&
而不是auto
例如,用例可以是
auto&& result = func_returning_lvalue_or_lvalue_reference();
或
或者别的什么
换句话说,基本代码中包含大量的
自动和&
?否是正常的。您不应该一直使用自动和&
。特别是,如果你需要一份副本,就不应该使用它。使用auto&&
可以获得副本(作为对临时对象的引用),也可以只获得对原始对象的引用
例如:
auto&& name = customer.get_name(); // std::string or const std::string&
name.erase(name.find(' '));
这段代码可以编译吗?如果它进行编译,它会更改客户的名称,还是只对临时对象起作用?如果不查看函数的签名,就无法判断。函数的签名有时会导致未定义的行为
void f()
{
string a{"a"};
string b{"b"};
auto&& c = move(a+b);
...
}
c将比a+b产生的临时值更有效。还有其他方法可以解决这个问题。该线程已经提供了足够的信息。如果你想接受任何初始化器,不管它是LValk还是RValm表达式,它的答案都是肯定的。@ HuroHuntWaTo:为什么不使用DeCype(Autoto)?“在C++中我们应该总是使用<代码> Auto&&< /Comp>”,总是做一些类型的规则非常可疑。在使用
auto&
方面给您提供了很好的建议:“当我需要一个可修改的变量时,我会在泛型代码中使用auto&
。[…]”我投票结束这个问题,因为我认为这也回答了您的问题。严格地说,这与Xeo的答案不完全相同,但我认为Xeo的答案也回答了这个问题。
void f()
{
string a{"a"};
string b{"b"};
auto&& c = move(a+b);
...
}