Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们是否应该始终使用auto&&;对于局部变量_C++_C++11_Auto - Fatal编程技术网

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);
    ...
}