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
}
지금은 전자는 아니지만 후자는 예기치 않은 것이 아닙니다. 문자열 리터럴은 배열입니까? – Tomek
모르겠다는 사람은 누구나 읽을 수 있습니다. 값으로 배열을 전달할 수는 없지만 (포인터로 붕괴됩니다) 배열에 대한 참조를 전달할 수는 있습니다. 여기서,'const T &'는 배열에 대한 참조가되며, 따라서'sizeof'는 배열의 크기를 나타냅니다. –
Martinho의 대답은 주요 질문을 다룹니다. 14.8.2.1/2 : "P가 참조 형이 아닌 경우 : A가 배열 형인 경우, 배열 대 포인터 표준 변환에 의해 생성 된 포인터 형이 'A'는 타입 공제를 위해, ... "는'P'는 하나 이상의 템플릿 매개 변수를 포함 할 수있는 템플릿 함수의 함수 매개 변수의 유형이고'A'는 함수 호출에 사용 된 표현식의 유형입니다. – aschepler