2016-10-21 6 views
0

멤버에 대한 참조를 반환하는 메서드로 클래스를 만들었습니다 (잘 캡슐화되지 않았습니다). 내가 재곡 연료 소모량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(); 
} 

에 대한 자동을 사용하고 그 결과 복사 constr에 나는 함수에서 참조를 감지하지 않는 자동차를 들었는데

입니다. 참조가없는 유형 만 자동으로 감지합니까?

+2

예. 이것은 C++ 유형 공제가 작동하는 방식입니다. 스콧 메이즈 (Scott Meyes)는 자동으로 "유형 공제 (type deduction)"에 관해 많은 이야기를 나누었으므로 좀 더 자세한 정보를 얻으려면 Google에 문의하십시오. 아니면 그를 통해 효과적인 현대 C + +를 데리러. 그는 이것에 전념 한 전체 장을 가지고있다. – Hayt

+1

[CppCon 2014 : Scott Meyers "유형 공제 및 왜 당신 케어"] (https://www.youtube.com/watch?v=wQxj20X-tIU) – Borgleader

답변

4

auto 그 자체만으로는 참조 유형을 추론하지 않습니다. 명시 적으로 왼쪽 값 참조가 필요하면 auto&을 사용하거나 유형 유추에 참조 축소 규칙을 사용하려면 auto&&을 사용할 수 있습니다.

표현식 유형이 필요한 경우 decltype을 사용하십시오. decltype(x)decltype((x)) 사이에는 차이가 있음을 기억하십시오. 후자는 참조를 유지합니다. 그 주제에

추가 자료 :

3

auto이 참조 인 경우 을 캡처하지 않기 때문에 짧은 대답이됩니다. 또한 cv 한정자를 캡처하지 않습니다.

이 동작이 필요한 경우 decltype을 사용해야합니다.