【问题标题】:How is it possible to return a reference via auto return type?如何通过自动返回类型返回引用?
【发布时间】:2016-12-04 05:50:48
【问题描述】:

我有一个函数auto function(...)。是否可以从中返回引用?

认为使用引用包装器 (std::ref?) 是正确的做法,但我并没有真正了解它的工作原理和使用方式,所以请善待写一个简短的解释。

我知道返回引用的危险,但在我的情况下,如果可以的话,它会让事情变得更容易。

【问题讨论】:

  • 你想返回什么引用?请注意返回对函数本地对象的引用非常非常糟糕。
  • 您是在问使用auto时是否可以通过引用返回?如果是这样,那么是的,你可以。 auto 可以与说明符和声明符一起使用。
  • @NathanOliver: OTOH, operator[ ] 通常会返回一个引用。
  • @MSalters 不是函数本地对象。
  • @NathanOliver:当然,但以std::vector::operator[ ]std::map 为例说明为什么它通常是安全的。

标签: c++ auto return-by-reference


【解决方案1】:

当然,使用 auto&,就像在 for 循环中一样,如果您太忙而无法明确写出类型并且不想获取值副本:

auto& nearly_ub() {
    static int foo;
    return foo;
}

但要注意 悬空 引用的可能性。

【讨论】:

  • 赞成理解提问者不想指定返回类型。
  • 我怀疑 OP 询问如何更改签名以仅返回参考
  • @Slava 你是对的。根据指定的参数,我想返回intQList<T>&。遗憾的是,给出的答案不符合我的要求。
  • 编辑:我的意思是QList<int>T&。 (我的函数实际上是一个模板。)
  • @Bathsheba 已接受答案,因为无法实现我想要实现的目标(通过 auto 提供不同的返回类型),如果您坚持使用一种返回类型,auto& 可以正常工作。
【解决方案2】:

看来您可以将decltype(auto) 设置为返回类型。

decltype(auto) nearly_ub() {
    static int foo;
    return foo;
}

https://stackoverflow.com/a/69233089/1414763

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 2021-11-12
    • 2010-12-06
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多