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

最后发布: 2017-08-03 10:07:53


问题

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

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

c++ c++11 auto
回答

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

当你使用auto ,你需要自己输入const&&&volatile

auto& x = testClass.GetFoo();

是你的修复。


回答

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

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

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