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 Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

62 throw std::out_of_range("Out of range");
можно указать больше инфомарции, например, индекс, по которому было обращение

98 constexpr void my_array<T, N>::fill(T val) {
99 for (std::size_t i = 0; i < N; ++i) {

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= делает не то, что он делает обычно

comment:2 Changed 4 years ago by Bagryanova Ekaterina

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

в задании написано вроде, что можно реализовать этот конструктор для специализации, чтобы не читать плохую память.

107 fill(false);
кажется, по условию этого не требуется?

у меня без них кажется не работают как минимум тесты, которые есть в задании. но я не уверена, потому что не стала разбираться в ошибках, а оставила как было.

1) эти конструкторы зачем-то нужны?

а что странного? как надо?

3) в данном случае такая реализация выглядит странно, потому что operator= делает не то, что он делает обычно

comment:3 Changed 4 years ago by Sokolov Viacheslav

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 Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.