【问题标题】:Why it does not declare a reference type if 'auto' var is initialized using a function returning reference?如果使用返回引用的函数初始化'auto' var,为什么它不声明引用类型?
【发布时间】:2017-08-03 10:07:53
【问题描述】:

当使用返回引用的函数初始化“自动”var 时,为什么 var 类型不是引用? 例如在下面的例子中,为什么 x 的类型是 Foo 而不是 Foo& ?

class TestClass {
public:
    Foo& GetFoo() { return mFoo; }
private:
    Foo mFoo;
};

int main()
{
    TestClass testClass;
    auto x = testClass.GetFoo(); // Why type of x is 'Foo' and not 'Foo&' ?

    return 0;
}

编辑:该链接说明了如何获取参考,但我的问题是这种行为的原因

【问题讨论】:

  • auto 的类型推断就是这样工作的。引用和 cv 限定符被丢弃。
  • C++11 "auto" semantics的可能重复
  • @EdgarRokyan 是正确的。您可以使用转发占位符,例如:auto&&
  • 我们想要值语义而不指定和重复长类型名称。这就是埃德加刚才所说的。
  • 嗯,没有参考会比较困难。

标签: c++ c++11 auto


【解决方案1】:

因为如果这样工作会很烦人。例如,您将如何指定您需要参考?

当你使用auto时,你需要把const&&&volatile放在自己里面。

auto& x = testClass.GetFoo();

是你的解决方案。

【讨论】:

  • 另外,它和模板推演的规则一样,就是这样。
  • @bolov IIRC 他们不一样
  • @PasserBy 除了初始化列表(但它们会随每个标准更改)它们是相同的stackoverflow.com/questions/36652180/…
【解决方案2】:

C++11 auto 类型推断规则删除引用、const 和 volatile 限定符。 但是,您可以要求 C++ 编译器使用 decltype 类型推断规则来保留所有这些限定符以声明变量类型。在您的情况下,它可能是:

decltype(auto) x = testClass.GetFoo();

但是这段代码会导致一些副作用,比如引用被破坏的对象,所以你需要记住真正的变量类型和生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2018-11-05
    • 1970-01-01
    • 2018-05-31
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多