为什么自动不检测函数的引用类型

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?