当使用返回引用的函数初始化'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;
}
编辑:该链接说明了如何获取参考,但我的问题是此行为的原因。
答案 0 :(得分:5)
因为如果它以这种方式工作会很烦人。例如,您如何指定不想要参考?
使用auto
时,您需要自己放置const
,&
,&&
和volatile
。
auto& x = testClass.GetFoo();
是你的修复。
答案 1 :(得分:2)
C ++ 11 auto
类型推断规则删除了引用,const和volatile限定符。
但是,您可以要求C ++编译器使用decltype
类型推断规则来保留所有这些限定符以声明变量类型。在你的情况下,它可能是:
decltype(auto) x = testClass.GetFoo();
但是这段代码会引起一些副作用,比如引用被破坏的对象,所以你需要记住真正的变量类型和生命时间。