#include <iostream>
using namespace std;
template <typename type>
int size(type a) {
return sizeof(a);
}
int main() {
int a[10] = {5};
cout << size(a) << " " << sizeof(a) << endl;
return 0;
}
Здравствуйте! Пожалуйста можете объяснить почему size(a)
возвращает 8
, а sizeof(a)
- 40
? И как внутри шаблона функции получить информацию об использованной массивом памяти? Спасибо!
В данном случае a
в шаблоне не будет массивом, так как массивы нельзя передавать по значению, а аргументы-массивы неявно переделываются в аргументы-указатели. В этом можно легко убедиться, добавив в метод проверку:
static_assert(::std::is_same_v<int *, type>);
Для корректного определения размера исходного объекта придется передавать его по ссылке:
template <typename type>
::std::size_t size(type const & a) {
return sizeof(a);
}
Компилятор вполне может вычеслять type
(по аргументу функции) как тип, содержащий столько то обьектов, так как может вызываться std::size
. И для следующей программы:
int a[15] = { 5 };
cout << size(a); //15
получим результат 15
В общем случаи всегда лучше аргументы шаблонной функции передавать по ссыльке и не использовать имена из стандартной библиотеки, и не использовать все имена из std
(using namespace std
)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Некоторые авторы используют два двоеточия :: перед неймспейсом std, например:
Есть строка, нужно перевести русские символы в ней на аналогичные английские (А на А, В на В,
написал прогу по фану на с++ а она почему то не вызывает ошибку 0_0
В разработке приложения я использую vue cli у меня есть такой код