Я хочу уточнить один момент, касающийся использования char
для доступа к элементам массива.
Мне известно, что char
- это тип, единственное предназначение которого - хранить однобайтовые символы. Этот тип может быть как unsigned char
, так и signed char
.
Следовательно, char
не годится для адресаций элементов массивов.
Например:
void Object::set(const char _char)
{
// size_t elements[UINT8_MAX];
elements[_char] += 1;
}
То есть, если char
окажется знаковым, то мы будем писать в элементы массива с индексами [-128; 127]. Очевидно, что в массиве не существует элементов с индексами [-128; -1].
Все верно?
Или, может быть, при использовании char
в качестве индексомера существует неявная конвертация в беззнаковый тип? Я сомневаюсь, что существует, но и полной уверенности, что использовать char
в описанной ситуации нельзя, у меня нет.
char - это тип, единственное предназначение которого - хранить однобайтовые символы
Нет, это целочисленный тип, который также может хранить куски многобайтовых символов и вообще произвольные данные.
Этот тип может быть как unsigned char, так и signed char.
Нет, это отдельный тип, хотя он может быть со знаком или без.
static_assert(not ::std::is_same_v<char, unsigned char>); // ok
static_assert(not ::std::is_same_v<char, signed char>); // ok
char не годится для адресаций элементов массивов
Нет, он вполне годится для индексации массивов и адресной арифметики вообще если проверять предположения по поводу его знаковости и выхода за пределы.
void Object::set(const char index)
{
static_assert(::std::is_unsigned_v<decltype(index)>);
static_assert(::std::numeric_limits<decltype(index)>::max() <= ::std::size(elements));
// size_t elements[UINT8_MAX];
elements[index] += 1;
}
В качестве индекса массива в c++ кошерно использовать любой интегральный тип, то есть: bool, char, signed char, unsigned char, char8_t, char16_t, char32_t, wchar_t, short, int, long, long long, unsigned short, unsigned int, unsigned long, unsigned long long
, как всегда таких случаях в Плюсах, ответственность за членовредительство лежит на программисте, никаких явных преобразований язык не проводит, поэтому в данной функции можно вставить проверку, что-то вроде assert(_char >= 0)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я реализовываю свой класс vector, но у меня возникла проблема: как передать в конструктор массив в таком виде: ClassName object = {1, 2, 3, 4, 5};?