请告诉我,我是否正确使用auto&& amp;对于函数返回值总是比使用auto更好的选择。例如,在
中auto val = someObj.getVal();
如果getVal()返回引用,则val将是一个副本。但是,使用通用参考汽车&&没有这样的劣势?我需要知道的唯一信息是getVal()是否为const。
答案 0 :(得分:4)
然而,使用通用参考汽车&&没有这样的劣势?
不,它不会复制返回值。
但是,有时需要复制,并且对auto&&
和引用使用prvalue
可以创建悬空引用。考虑这种情况:
struct A {
// A: Another programmer changed it from:
// int getVal() { return mInteger; }
// B
int &getVal() { return mInteger; }
private:
int mInteger;
};
int main() {
A *a = new A;
auto integerCopy = a->getVal();
// int& on case B, int&& on case A.
auto&& integerRvalueRef = a->getVal();
delete a;
// Ok, no matter what getVal returns.
std::cout << integerCopy;
// Dangling Reference dereference if getVal returns a reference.
std::cout << integerRvalueRef;
}
正如您所看到的,使用auto
,更改此返回值没有问题。但是,使用auto&&
,它创建了一个悬空引用。
像常规参考一样使用auto&&
:谨慎对待。将它用于prvalue
和参考值返回值可能会导致意外情况。