2017-01-18 3 views
4

이 코드는 2015자동 참조 ++

int main() { 
    const int i = 42; 
    auto j = i; const auto &k = i; auto *p = &i; 
    const auto j2 = i, &k2 = i; 
} 

결과 유형이었다 비주얼 스튜디오 나에게 이상한 디버그 정보를 줄 :

&k = const int & 
&k2 = const int * 

내가 그 두 const int & 있어야한다고 생각합니다.

질문 : 내 Visual Studio 디버거가 &k&k2이 다른 유형이라는 이유는 무엇입니까?

+2

질문은 ...? :) – Pierre

+0

질문은 왜 & k와 & k2가 다른 유형입니까? –

+0

& k와 & k2가 다른 유형인지 어떻게 알 수 있습니까? – cpplearner

답변

1

kk2은 모두 const int& 유형입니다.


다음은 전체 유형 목록입니다. 최고 수준 constauto 유형 공제에 대해 삭제됩니다.

int main() 
{ 
    const int i = 42; 
    auto j = i; // i is an int (const is top-level) 
    const auto &k = i; // k is a const int& 
    auto *p = &i; // p is a const int* (const persists as not top-level). 
    const auto j2 = i, &k2 = i; // j2 is a const int, k2 is a const int& 
} 

마지막으로, 만약 당신이 다음

auto q = &k2; 

를 기록했던 const 최상위 때문에 폐기되지 않고 auto 유형 공제가되지 않기 때문에 q의 종류는 const int*입니다. 이것은 당신이 관찰 한 디버그 정보를 복구합니다.

j2k2은 비슷하지 않지만 실제로는 선언이 쉼표로 작동하는 방식 때문입니다 (cf. 혼란은 당신은 항상 확인이 C++ 11 표준 라이브러리 함수 is_same을 사용하기위한 찾을 수

const int j2 = i, &k2 = i;

를 작성하여 실을 뽑아 푼 수 있습니다 예를 들어, decltype는 인수의 유형를 복구

bool am_I_the_same = std::is_same<decltype(k2), const int&)::value

.

참조 : http://en.cppreference.com/w/cpp/types/is_same

+0

감사합니다. 문제는, 나는 왜 & k가 (const int & Reference) 그러나 k2가 (const int * Pointer)인지 이해하지 못한다. 둘 다 const int가 아니어야합니까? –

+0

디버그 환경 때문이라고 하시겠습니까? 왜 & k? j2와 k2는 닮지 않은 것처럼 보입니다!? 선언은 쉼표로 어떻게 작동합니까? 나는 또한 당신이 말한 것과 똑같은 것으로 시험합니다, 그것이 사실이지만 이해하지 못합니다 .... 답변을 검토하십시오! 감사합니다 –

+0

아니 * 아무것도 * 디버그 환경과 관련이 있습니다. 나는 왜'q'가'const int *'인지 증명한다. 쉼표에 관해서는,'j2'와'& k2' (여기서 &는 참조를 나타냄)가 동일한'const auto' 유형이라는 것을 의미합니다. – Bathsheba