如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
Why it does not declare a reference type if 'auto' var is initialized using a function returning reference?
当使用返回引用的函数初始化"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();
但是这段代码可能会导致一些副作用,比如引用被破坏的对象,所以你需要记住真正的变量类型和生命周期。
相关文章:
- 为什么在定义函数之前先声明它
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么C++编译器没有检测到正确声明的类?
- 包含的类类型显然没有声明,为什么?
- 为什么我必须以这种方式声明指针?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么 C++ 中的以下结构声明会导致退出 127?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 为什么声明'globally'字符串与声明的"本地"不同?
- 为什么声明的主要措辞在标准草案之间发生变化
- 为什么声明' void(*pf)(int) = bar; '会触发下面代码片段中的' static_assert
- 为什么 g++ 声明某些 valarray o 存在"no matching function for call cbegin(o)"<double>?
- 为什么声明没有大小的向量需要push_back才能接受带有cin的输入
- 为什么声明出现在一个混乱的符号名中