Я просто попытался эквивалент в г ++ 4.5 C++ 0x режим для символьных массивов и не позвольте мне как определить
template <typename T>void moresilly(const T v[],const char *description)
и
template <typename T>void moresilly(const T *v,const char *description)
он утверждает, что оба эти же типа.
Я имел функцию:
template <typename T>void silly(const T & v,const char *description)
{
cout<<"size of "<<description<<" is "<< sizeof(T)<<endl;
moresilly(v,description);
}
Это правильно получает размер массива, если он принят и указатель, если он принят, но я не могу использовать moresilly различать указатель и массив, так что я могу 't указать массив из 4 символов из указателя на n символов.
Возможно, что у него есть шаблоны на T [1], T [2], T [3] и т. Д., Но уже есть сообщение о том, что разные компиляторы обрабатывают этот (или какой-то подобный случай) по-разному и что gnu предпочитает совпадение указателей в C++ 11.
... добавлено позже: После некоторого эксперимента я нашел то, что работает в г ++ 4,5
template <typename T,size_t L>void moresilly(const T (&v)[L],const char *description)
{
cout<<description<<" is an array"<<endl;
}
template <typename T>void moresilly(const T *v,const char *description)
{
cout<<description<<" is a pointer"<<endl;
}
template <typename T>void moresilly(const T v,const char *description)
{
cout<<description<<" is a raw value"<<endl;
}
template <typename T>void silly(const T & v,const char *description)
{
cout<<"size of "<<description<<" is "<< sizeof(T)<<endl;
moresilly(v,description);
}
со следующими работает правильно
silly("12345","immediate string of 5 characters plus zero");
silly((const char *)"12345","immediate constant char pointer of 5 characters plus zero");
char testarray[]="abcdef";
silly(testarray,"char array of 6 characters plus zero");
const char testarray2[]="abcdefg";
silly(testarray2,"const char array of 7 characters plus zero");
Обратите внимание, что если первая функция определяется с "const T v [L]" вместо "const T (& v) [L]" он не работает, никогда не согласуется ни с чем.
Итак, я решил вашу проблему, но не ожидаю, что это сработает в других версиях компилятора, включая будущие. Вот почему я ненавижу C++. Так или иначе, определение языка настолько непонятно, что компиляторы полны неустойчивых краевых случаев.
Это полезный трюк, хотя я могу его использовать.
Что именно вы подразумеваете под словом «рассказать разницу»? Почему «рассмотрение объявления типа» не будет полным решением? Вам нужно иметь какое-то другое поведение для частичной специализации шаблона или подобного? –
Будут случаи, когда sizeof равен. В любом случае, легкий способ увидеть разницу - посмотреть исходный код. Какова реальная проблема, которую вы пытаетесь решить? – nos