2012-11-09 15 views
6
template<typename T> 
void print_size(const T& x) 
{ 
    std::cout << sizeof(x) << '\n'; 
} 

int main() 
{ 
    print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point."); 
    // prints 115 
} 

이것은 최신 g ++ 컴파일러에서 115를 인쇄합니다. 그래서 분명히 T은 (포인터 대신에) 배열로 추론됩니다. 그 행동은 표준에 의해 보장됩니까? 다음 코드는 포인터의 크기를 출력하기 때문에 조금 놀랐습니다. auto은 템플릿 인수 공제와 정확히 똑같은 동작을한다고 생각합니까?문자열 리터럴에 대한 템플릿 인수 공제

int main() 
{ 
    auto x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point."; 
    print_size(x); 
    // prints 4 
} 
+1

지금은 전자는 아니지만 후자는 예기치 않은 것이 아닙니다. 문자열 리터럴은 배열입니까? – Tomek

+2

모르겠다는 사람은 누구나 읽을 수 있습니다. 값으로 배열을 전달할 수는 없지만 (포인터로 붕괴됩니다) 배열에 대한 참조를 전달할 수는 있습니다. 여기서,'const T &'는 배열에 대한 참조가되며, 따라서'sizeof'는 배열의 크기를 나타냅니다. –

+1

Martinho의 대답은 주요 질문을 다룹니다. 14.8.2.1/2 : "P가 참조 형이 아닌 경우 : A가 배열 형인 경우, 배열 대 포인터 표준 변환에 의해 생성 된 포인터 형이 'A'는 타입 공제를 위해, ... "는'P'는 하나 이상의 템플릿 매개 변수를 포함 할 수있는 템플릿 함수의 함수 매개 변수의 유형이고'A'는 함수 호출에 사용 된 표현식의 유형입니다. – aschepler

답변

8

auto 템플릿 인수를 공제 똑같이 1 동작합니다. 정확히 T을 (를) 좋아합니다! 이것으로

template<typename T> 
void print_size(T x) 
{ 
    std::cout << sizeof(x) << '\n'; 
} 

int main() 
{ 
    print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point."); 
    // prints 4 
    auto x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point."; 
    print_size(x); 
    // prints 4 
} 

:

이 비교

template<typename T> 
void print_size(const T& x) 
{ 
    std::cout << sizeof(x) << '\n'; 
} 

int main() 
{ 
    print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point."); 
    // prints 115 
    const auto& x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point."; 
    print_size(x); 
    // prints 115 
} 

1 그렇진하지만,이 코너의 경우 중 하나가 아닙니다.

+0

어리석은 나를. 커튼을 들어 주셔서 감사합니다 :) – fredoverflow

+0

물론 C 스타일 배열을 C++의 값으로 전달할 수 없기 때문입니다. – Yakk

+0

@Yakk : 실제로 C 호환성을 잃을 수 있습니다. C에는 참조가 없으므로 기존의 동작이 없습니다. – MSalters