Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор , 
V
    Опции темы
MAKCim
Дата 9.6.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Fazil6 @  9.6.2008,  18:01 Найти цитируемый пост)
потому, что нужно обеспечить порядок вычисления операндов 

и в чем проблема?
приведи пример, что по-твоему невозможно сделать


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
d06osipov
Дата 9.6.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  9.6.2008,  10:57 Найти цитируемый пост)
Семантика оператора "," меняется при перегрузке и поэтому не рекомендуется его перегружать. Тудаже относится и перегрузка && и || 


Во-первых, я что-то не слышал про стандартную семантику && и ||. А во-вторых, при перегрузке копирующего конструктора и оператора = тоже меняется семантика. Это значит, их не рекомендуется перегружать?

PM MAIL   Вверх
Fazil6
Дата 9.6.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(MAKCim @  9.6.2008,  18:20 Найти цитируемый пост)
приведи пример, что по-твоему невозможно сделать

не совсем понимаю вопроса. В свою очередь встречный вопрос: как обеспечить чтобы левый операнд вычислялся всегда первым, а правый вторым?
Цитата(d06osipov @  9.6.2008,  19:09 Найти цитируемый пост)
Во-первых, я что-то не слышал про стандартную семантику && и ||.

ну и чем ты гордишься? Почитай топик по ссылке - там четко видно к чему приводит перегрузка ||
Цитата(d06osipov @  9.6.2008,  19:09 Найти цитируемый пост)
А во-вторых, при перегрузке копирующего конструктора и оператора = тоже меняется семантика. Это значит, их не рекомендуется перегружать?

в четырнадцатых слабо себе представляю перегрузку копирующего конструктора, с изменяющейся семантикой... Понимаешь, старик, можно прегрузить к примеру operator-, изменив его семантику так, чтобы он делал умножение (согласись, это оригинально, ведь именно для этого перегрузку придумали).  После этого в лучшем случае ты будешь проклят своими колегами, а может и покалечат (оторвут руки) 

PM MAIL   Вверх
andrew_121
Дата 9.6.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата

После этого в лучшем случае ты будешь проклят своими колегами, а может и покалечат (оторвут руки)

Интересная дискуссия. Много нового узнал...
Но правда, не вижу надобности перегружать "operator ,".

Это сообщение отредактировал(а) andrew_121 - 9.6.2008, 22:45


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.6.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



andrew_121, действительно, надобности это делать почти никогда нет. Но, иногда встречаются случаи, когда сделав это мы получим что-то, например, удобочитаемость кода. Пример, что лучше выглядит, это:
Код
std::vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);
array.push_back(6);
array.push_back(7);
или это
Код
std::vector<int> array;
using namespace boost::assign;
array += 1,2,3,4,5,6,7;

PM   Вверх
andrew_121
Дата 9.6.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



bsa: Да, беспорно, красивей, удобней, понятней! Респект!
Слышал про Boost, но некогда не юзал, поделитесь ссылками на оного. И на доки, и на форум об оном тожА. Плиз.

Это сообщение отредактировал(а) andrew_121 - 9.6.2008, 21:38


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.6.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(andrew_121 @ 9.6.2008,  21:20)
Слышал про Boost, но некогда не юзал, поделитесь ссылками на оного.

http://www.google.com/search?q=boost

Добавлено через 2 минуты и 6 секунд
Цитата(MAKCim @ 9.6.2008,  18:20)
Цитата(Fazil6 @  9.6.2008,  18:01 Найти цитируемый пост)
потому, что нужно обеспечить порядок вычисления операндов 

и в чем проблема?
приведи пример, что по-твоему невозможно сделать

Вся хитрость операторов && и || в том, что они не вычисляют второй свой аргумент, если уже по первому известен результат.
PM   Вверх
skyboy
Дата 9.6.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



почитайте про точки следования
undefined behavior не страшен только тем, кто "намертво" прикреплен к одной версии определенного компилятора. В противном случае, может оказаться, что программа работает не так, как надо. Только потому,  что кто-то ради "удобочитаемости"(и то - спорно) вместо пяти точек следования(к примеру; т.е. 5 строк с ";" в конце) сделал одну(после выражения перед первой запятой в строке). 
PM MAIL   Вверх
andrew_121
Дата 9.6.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



skyboy:  То же вариант.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
d06osipov
Дата 10.6.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  9.6.2008,  20:26 Найти цитируемый пост)
в четырнадцатых слабо себе представляю перегрузку копирующего конструктора, с изменяющейся семантикой

А что, есть смысл перегружать что-либо без изменения семантики? 


Цитата(Fazil6 @  9.6.2008,  20:26 Найти цитируемый пост)
Цитата(d06osipov @  9.6.2008,  19:09 Найти цитируемый пост)
Во-первых, я что-то не слышал про стандартную семантику && и ||.

ну и чем ты гордишься? Почитай топик по ссылке - там четко видно к чему приводит перегрузка ||

Перегрузка && и ||, как и перегрузка любых других операторов, приводит к изменению их семантики (вполне возможно, предыдущая семантика --- ошибка компиляци). Есть одна стандартная версия &&, || и т. п. для параметров (bool,bool) которую можно применять к указателям используя конвертацию указателей к bool. Что же может испортить перегрузка этих операторов для объектов и ссылок на объекты? Даже для указателей, мне кажется, гораздо опаснее использовать неявную конвертацию к bool, чем перегружать для них оператор && (тем более, что для (bool,bool) его нельзя перегрузить).
PM MAIL   Вверх
Fazil6
Дата 10.6.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(d06osipov @  10.6.2008,  09:03 Найти цитируемый пост)
А что, есть смысл перегружать что-либо без изменения семантики? 

конечно. Именно так  и нужно перегружать. Что по твоему семантика? Семантика оператора - это его смысл. Смысл оператора "+" в сложении. Вот и перегружать его надо так, чтобы он по смыслу делал сложение. Где тут изменение семантики?
Цитата(d06osipov @  10.6.2008,  09:03 Найти цитируемый пост)
Перегрузка && и ||, как и перегрузка любых других операторов, приводит к изменению их семантики
 правильная перегрузка не должна изменять семантику. Перегрузка стандартных "&&", "||" и "," всегда приводит к изменению семантики, ибо стандартная семантика этих операторов фиксирует порядок вычисления аргументов, и далеко не всегда эти операторы вычисляют оба аргумента, а перегрузка делает их совершенно обычными операторами. Такое поведение нестандартно для этих операторов. Ты в коде видишь a+b и совершенно справедливо ожидаешь от этого выражения сложения. Совершенно справедливо от выражения a||b ожидать того, что делает оператор || , а не обычная функция, аргументами, которой являются  a и b.

Цитата(d06osipov @  10.6.2008,  09:03 Найти цитируемый пост)
(вполне возможно, предыдущая семантика --- ошибка компиляци)

это поведение  не ошибка, а соответствие стандарту. 
PM MAIL   Вверх
d06osipov
Дата 10.6.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  10.6.2008,  09:58 Найти цитируемый пост)

это поведение  не ошибка, а соответствие стандарту.  


Я имел ввиду вот что:
Код

class A{};

int main()
{ A a1,a2;
  a1||a2;
  return 0;
}

В этом случае --- семантика оператора a1||a2 --- ошибка компиляции.

Цитата(Fazil6 @  10.6.2008,  09:58 Найти цитируемый пост)
Что по твоему семантика? Семантика оператора - это его смысл

Мы с вами по разному понимаем слово семантика. Я вкладываю в него не смысл, а то, что конкретно делает данная сущность (строгое определение во всех деталях), иными словами --- описание изменения состояния машины после выполнение данной сущности. А смысл я называю спецификацией (пример: +. Спецификация: сложить два числа. Семантика: записывает в стек сумму двух чисел без побочных эффектов). В этом случае, перегружать, не меняя семантики --- значит, писать тавтологичный код.

PM MAIL   Вверх
Fazil6
Дата 10.6.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(d06osipov @  10.6.2008,  10:08 Найти цитируемый пост)
А смысл я называю спецификацией (пример: +. Спецификация: сложить два числа. Семантика: записывает в стек сумму двух чисел без побочных эффектов). 

Не понимаю. В чем тогда по-твоему изменение семантики при перегрузке "+" для каких-нибудь объектов учитывая, что спецификация не изменилась(сложить два объекта)?
PM MAIL   Вверх
Alek86
Дата 10.6.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(d06osipov @  10.6.2008,  10:08 Найти цитируемый пост)
Я вкладываю в него не смысл, а то, что конкретно делает данная сущность (строгое определение во всех деталях), иными словами --- описание изменения состояния машины после выполнение данной сущности. А смысл я называю спецификацией

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 10.6.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

std::vector<std::string> buffers;
std::string s;
while (std::getline(std::cin, s), !std::cin.eof())
{
  buffers.push_back(s);

}

как это будет работать?
т.е сначала выполняется std::getline(std::cin, s), потом !std::cin.eof(), а что проверяется в while? возвращаемое значение std::getline(std::cin, s)?



--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1146 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.