Re[8]: как эффективно передать элементы из одного вектора в другой
От: _hum_ Беларусь  
Дата: 07.04.16 21:39
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, _hum_, Вы писали:


__>>это по правилу хорошего тона? ну, так его не всегда соблюдают. а в общем случае ведь никто не запретит просто забрать данные у x-value способом, делающим объект невалидным для последующих операций.


W>Бредовый пример. Мне кажется, что это всё равно, как если бы написать в своём контейнере что-то вроде
struct MyArray { 
W>  ...
W>  char* begin() const {
W>    return (char*)(rand() % 2 ? 0 : "begin");
W>  }
W>  char* end() const {
W>    return (char*)"end";
W>  }
W>};
а потом жаловаться, что range-based-for с таким классом не работает (да ещё и глючит каждый раз по разному), а поэтому range-based-for плохой и использовать его не надо.

W>А то ведь в стандарте тоже соглашения об смысле методов begin и end — не более чем "правила хорошего тона".

не понял вашу мысль. моя состояла в том, что move-assignement operator/move copy constructor, вообще говоря, не обязаны оставлять переданное им x-value в валидном состоянии (порой очень муторно заводить для объекта "нулевое состояние" и переводить его туда. проще забрать данные и "давай, до свидания"). в конце-концов, в чем тогда выгода вводить eXpired-value, если все равно с ним нужно цацкаться, как с обычным l-value?

__>>ну так для того, чтобы убедиться, что у вектора есть нулевое состояние и оно ничем не грозит, мне нужно лезть куда-то в доки и стандарты, в то время как swap делает это логически прозрачным.

W>А swap для двух объектов произвольного типа что делает? Неужели обменивает их состояние? Откуда у тебя такая уверенность в этом? Сомневаюсь, что разумный человек может быть в этом уверен без "залезания в доки" или без просмотра исходников. Ведь обменивающее поведение swap — не более чем правило хорошего тона!

речь шла не о генерализированной функции swap, а о методе. а это значит, никаких вопросов быть не должно — если есть такой метод, значит, есть корректная реализация обмена для векторов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.