Opened 4 years ago
Closed 4 years ago
#903 closed ожидаются исправления (задача сдана)
WW #13
Reported by: | Bagryanova Ekaterina | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_array | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (4)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
в задании написано вроде, что можно реализовать этот конструктор для специализации, чтобы не читать плохую память.
107 fill(false);
кажется, по условию этого не требуется?
у меня без них кажется не работают как минимум тесты, которые есть в задании. но я не уверена, потому что не стала разбираться в ошибках, а оставила как было.
1) эти конструкторы зачем-то нужны?
а что странного? как надо?
3) в данном случае такая реализация выглядит странно, потому что operator= делает не то, что он делает обычно
comment:3 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
в задании написано вроде, что можно реализовать этот конструктор для специализации, чтобы не читать плохую память.
Ага, верно
у меня без них кажется не работают как минимум тесты, которые есть в задании. но я не уверена, потому что не стала разбираться в ошибках, а оставила как было.
Скорее всего поможет дописать --std=c++17. Начиная с этой версии стандарта появился guranteed copy elision в виду (N)RVO. Благодаря этому объект без конструкторов копирования / перемещения можно возвращать из функции.
а что странного? как надо?
Что странного: index остается не инициализированным, а operator= зачем-то произведет завись в оригинальный массив (по неинициализированному инексу).
Почему это работает: потому что хотя формально до 17 стандарта требуется наличие конструктора копирования / перемещения, компилятор все равно применяет RVO и этот код не исполняется.
Поэтому с моей точки зрения лучший вариант - явно удалить эти конструкторы и выставить 17 версию стандарта.
Альтернативно можно воспользоваться =default реализацией, она в данном случае сделает все правильно (скопирует 2 поля).
116 throw std::out_of_range("Out of range. Attempt to access at index " + std::to_string(index) + " when except an index less than " + std::to_string(N) + ".");
дублируется 4 раза, можно сделать вспомогательную функцию, чтобы избежать дублирования
comment:4 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
62 throw std::out_of_range("Out of range");
можно указать больше инфомарции, например, индекс, по которому было обращение
100 data[i] = val;
101 }
102 }
с такой реализацией нет смысла принимать по значению - лучше по const T&
107 fill(false);
кажется, по условию этого не требуется?
116 return ((data[index / 8] >> (index % 8)) & 1);
130 return ((data[index / 8] >> (index % 8)) & 1u);
рассогласованы; кроме того, .at() реализованы несимметрично - можно в const-версии тоже вернуть
124 return operator[](index);
155 for (std::size_t i = 0; i < SIZE; ++i) {
156 data[i] = value;
157 }
можно эффективнее с помощью memset
163 template <std::size_t N>
164 constexpr my_array<bool, N>::proxy::proxy(const proxy &other) noexcept {
165 *this = other;
166 }
167
168 template <std::size_t N>
169 constexpr my_array<bool, N>::proxy::proxy(proxy &&other) noexcept : value(other.value) {
170 *this = other;
171 }
1) эти конструкторы зачем-то нужны?
2) странно, что они реализованы по-разному
3) в данном случае такая реализация выглядит странно, потому что operator= делает не то, что он делает обычно