Здравствуйте, 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, а о методе. а это значит, никаких вопросов быть не должно — если есть такой метод, значит, есть корректная реализация обмена для векторов.