汽车与汽车&&用于函数返回值

时间:2016-10-31 07:42:25

标签: c++ function c++11 return-value auto

请告诉我,我是否正确使用auto&& amp;对于函数返回值总是比使用auto更好的选择。例如,在

auto val = someObj.getVal();

如果getVal()返回引用,则val将是一个副本。但是,使用通用参考汽车&&没有这样的劣势?我需要知道的唯一信息是getVal()是否为const。

1 个答案:

答案 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和参考值返回值可能会导致意外情况。