如果使用返回引用的函数初始化'auto'var,为什么它不声明引用类型?

时间:2017-08-03 10:07:53

标签: c++ c++11 auto

当使用返回引用的函数初始化'auto'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;
}

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

2 个答案:

答案 0 :(得分:5)

因为如果它以这种方式工作会很烦人。例如,您如何指定想要参考?

使用auto时,您需要自己放置const&&&volatile

auto& x = testClass.GetFoo();

是你的修复。

答案 1 :(得分:2)

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

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

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