为什么自动不检测函数的引用类型
why auto doesn't detect reference type of function
我做了一个class with 方法,returns 引用成员(封装不好)。我正在使用 auto 重新调整功能
class classA
{
public:
classA(classA & rhs)
{
cout<<"copy constr A"<<endl;
};
classA() = default;
};
class classB
{
private:
classA obA;
public:
classA& getRefA(){return obA;}
};
int main()
{
classB obB;
auto ob = obB.getRefA();
}
结果是
复制构造 A
我知道 auto 不检测来自函数的引用。自动检测的是没有引用的类型吗?
简短的回答是因为 auto
没有捕获 任何 引用。它也不会捕获 cv 限定符。
如果您需要这种行为,您应该使用 decltype
。
auto
本身并不能推断引用类型。如果您明确需要左值引用,则可以使用 auto&
,或者使用 auto&&
来使用引用折叠规则进行类型推断。
如果需要表达式的类型,请使用decltype
。请记住 decltype(x)
和 decltype((x))
之间存在差异——后者保留引用。
关于该主题的更多资源:
- Universal References in C++11
- use of rvalue reference and auto
- In C++, what expressions yield a reference type when decltype is applied to them?
我做了一个class with 方法,returns 引用成员(封装不好)。我正在使用 auto 重新调整功能
class classA
{
public:
classA(classA & rhs)
{
cout<<"copy constr A"<<endl;
};
classA() = default;
};
class classB
{
private:
classA obA;
public:
classA& getRefA(){return obA;}
};
int main()
{
classB obB;
auto ob = obB.getRefA();
}
结果是 复制构造 A
我知道 auto 不检测来自函数的引用。自动检测的是没有引用的类型吗?
简短的回答是因为 auto
没有捕获 任何 引用。它也不会捕获 cv 限定符。
如果您需要这种行为,您应该使用 decltype
。
auto
本身并不能推断引用类型。如果您明确需要左值引用,则可以使用 auto&
,或者使用 auto&&
来使用引用折叠规则进行类型推断。
如果需要表达式的类型,请使用decltype
。请记住 decltype(x)
和 decltype((x))
之间存在差异——后者保留引用。
关于该主题的更多资源:
- Universal References in C++11
- use of rvalue reference and auto
- In C++, what expressions yield a reference type when decltype is applied to them?