函数返回值的 auto 与 auto&&

Ale*_*yan 6 c++ function return-value auto c++11

您能告诉我,使用 auto&& 作为函数返回值总是比使用 auto 更好的选择吗?例如,在

auto val = someObj.getVal();
Run Code Online (Sandbox Code Playgroud)

如果 getVal() 返回引用,则 val 将是一个副本。但是,使用通用引用auto&&就没有这样的缺点吗?我需要知道的唯一信息是 getVal() 是否为 const。

Shm*_* H. 6

但是,使用通用引用auto&&就没有这样的缺点吗?

不,它不会复制返回值。

问题

但是,有时复制是必要的,并且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;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,对于auto,更改此返回值没有问题。但是,使用 时auto&&,它创建了一个悬空引用。

结论

像常规参考一样使用auto&&:谨慎对待。将其用于prvalue参考值和返回值可能会导致意外的结果。