【问题标题】:auto vs auto&& for a function return value函数返回值的 auto vs auto&&
【发布时间】:2016-10-31 07:42:25
【问题描述】:

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

auto val = someObj.getVal();

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

【问题讨论】:

  • 你不需要知道getVal 是否为常量。 auto&& 是转发引用;例如,如果 getVal 是一个 const 左值,它将推断为 T const &

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


【解决方案1】:

但是,使用通用引用 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;
}

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

结论

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

【讨论】:

  • 两种方法各有优缺点。
  • @AlexKoshulyan 只要您仅将其与引用一起使用,就可以了。在大多数情况下,autoprvalue 没有开销(没有复制或移动:函数将首先在被调用变量上初始化其返回值)。
  • 为什么不使用const auto&amp; 作为对象返回类型?在这种情况下,不需要 RVO,因为函数中要返回的对象的生命周期会延长。
  • @DrumM 对这个例子没有影响(它与auto&amp;&amp; 相同)。没有“通用”方式,因为 const auto&amp; 不会延长 lvalue 的生命周期。
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 2014-02-17
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多