请您告诉我,我是否正确地认为,使用auto &对于函数,返回值总是比使用auto更好的选择。例如,在
auto val = someObj.getVal();如果getVal()返回引用,则val将是一个副本。然而,使用通用参考汽车&&有没有这样的缺点呢?我需要知道的唯一信息是getVal()是否是const。
发布于 2016-10-31 08:37:10
然而,使用通用参考汽车&&有没有这样的缺点呢?
不,它不会复制返回值。
问题所在
但是,有时复制是必要的,对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和引用值返回值可能会带来糟糕的惊喜。
https://stackoverflow.com/questions/40338200
复制相似问题