왜 배열이 템플릿 함수의 포인터로 쇠퇴하는지 이해할 수 없습니다.왜 배열이 템플릿 함수의 포인터에 부패합니까?
다음 코드를 살펴보면 : 매개 변수가 강제로 참조 (함수 f1) 일 때 감쇠되지 않습니다. 다른 함수 f에서는 부패합니다. 함수 f의 T 타입이 const char (buff &) [3]가 아닌 const char * (올바르게 이해한다면)입니까?
#include <iostream>
template <class T>
void f(T buff) {
std::cout << "f:buff size:" << sizeof(buff) << std::endl; //prints 4
}
template <class T>
void f1(T& buff) {
std::cout << "f:buff size:" << sizeof(buff) << std::endl; //prints 3
}
int main(int argc, char *argv[]) {
const char buff[3] = {0,0,0};
std::cout << "buff size:" << sizeof(buff) << std::endl; //prints 3
f(buff);
f1(buff);
return 0;
}
간단히 'in t '를'f'로하면'T'는'int'가 아니라'int'가됩니다. 그러므로, "왜 함수의 형태가 const char [3]이 아니라"const char *'입니까?와 같은 질문을해야합니다. " (누락 된 '&'귀하의 답변에 비해) –
... (내 마지막 코멘트에서 계속). C/C++ 언어에 대한 가장 바보 같은 점은 매개 변수에'const char [3]'을 넣으면 컴파일러는 그것을 자동적으로'const char *'로 재 작성한다는 것입니다. 예를 들어, 로컬 변수에서는 이와 같은 일이 발생하지 않습니다. 나는 이것이 현재 (C++ 컴파일러에서 적어도) 경고로 이어져야한다고 생각한다. –