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。
但是,使用通用引用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参考值和返回值可能会导致意外的结果。