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

Why it does not declare a reference type if 'auto' var is initialized using a function returning reference?

本文关键字:为什么 声明 引用类型 var auto 引用 返回 函数 如果 初始化      更新时间:2023-10-16

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

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

因为如果它以这种方式工作会很烦人。例如,您将如何指定您不需要引用?

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

auto& x = testClass.GetFoo();

是你的修复。

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

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

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