На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (77) « Первая ... 30 31 [32] 33 34 ...  76 77  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Цитата amk @
    Да, это проблема. Если бы можно было отложить вычисление параметров до того момента, когда они действительно понадобятся. Но в C++ такой возможности нет - это не Алгол.

    Так вот и незачем перегружать операторы, которые семантически нельзя представить в виде функций.
      D_KEY, нельзя заставлять поступать так-то и так-то исключительно из религиозных соображений. Тогда уж надо запретить перегружать + как умножение, префиксный ++ как постфиксный итп. Это было бы полезнее. Формальных же препятствий к перегрузке этих операций нет.
        Цитата D_KEY @
        Так вот и незачем перегружать операторы, которые семантически нельзя представить в виде функций.

        Кстати где-то видел такую рекомендацию: перегрузку операторов делать так: написать функцию, которая выполняет тоже самое, что и перегружаемый оператор, потом внутри перегрузки использовать эту функцию, честно говоря, не очень понимаю смысла сей рекомендации
          Цитата Qraizer @
          D_KEY, нельзя заставлять поступать так-то и так-то исключительно из религиозных соображений.

          Это не религиозные убеждения. Перегрузим ;?
          Если бы в С++ был способ перегрузить эти операторы и сохранить порядок вычислений, то я бы не был против такой перегрузки.

          Цитата
          Тогда уж надо запретить перегружать + как умножение, префиксный ++ как постфиксный итп.

          Во-первых, это невозможно. Во-вторых, перегрузка этих операторов не оказывает влияние на порядок выполнения.

          Добавлено
          Цитата kanes @
          Цитата D_KEY @
          Так вот и незачем перегружать операторы, которые семантически нельзя представить в виде функций.

          Кстати где-то видел такую рекомендацию: перегрузку операторов делать так: написать функцию, которая выполняет тоже самое, что и перегружаемый оператор, потом внутри перегрузки использовать эту функцию, честно говоря, не очень понимаю смысла сей рекомендации

          Возможно это касалось виртуальных методов. Вроде перегрузки оператора вывода(то есть сдвига ;)). Обычно пишется отдельный виртуальный метод, а оператор переопределяется для ссылки на базовый класс.
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Перегрузим ;?

            говорили уже, что ; - не оператор. пробел перегрузи.
              Цитата GoldFinch @
              Цитата D_KEY @
              Перегрузим ;?

              говорили уже, что ; - не оператор. пробел перегрузи.

              Так и я о том. Перегружать , также глупо.

              Добавлено
              GoldFinch, ты просто рассматриваешь С++ как некую данность, я же хочу понять почему(и зачем) он такой. Пару лет назад, такие книги, как D&E, давали мне нужные ответы, но теперь мне этого недостаточно.
              Но тут это все-таки не совсем в тему ;)

              Добавлено
              Разве можно сказать, что перегрузка , || && вообще является таковой? Их встроенные версии не являются простыми операторами(они вообще по сути своей не являются операторами, хотя и носят такое название), это специальные языковые формы и их нельзя имитировать другими средствами языка. Их "перегрузка" является введением совершенно иной сущности(нового оператора), но с тем же обозначением. Но в С++ нельзя определять собственные операторы, соответственно, даже с этой стороны, такие перегрузки противоречат идеологии языка...
              Сообщение отредактировано: D_KEY -
                D_KEY, точно также перегрузка << для потоков меняет сущность оператора сдвига,
                а также перегрузка % в boost.format, перегрузка & в boost.serialization, и еще куча перегрузок меняющих семантику операторов.
                  GoldFinch, сущность поменять можно, но не до абсурда, типа того что перегруженный << на самом деле работает как >> или + работает как умножение
                    Мне показалось что D_KEY делал упор не на изменение семантики самой операции, а на изменение семантики в контексте C++ (из-за изменения порядка выполнения).
                    Например код (который пишут некоторые мои знакомые):
                    ExpandedWrap disabled
                      foo() && bar();

                    По сути эквивалентен
                    ExpandedWrap disabled
                      if(foo())bar();

                    и гарантирует что bar будет вызван только в случае успешного выполнения foo().
                    А если для возвращаемого значения bar() перегрузить оператор &&, то эти функции уже могут быть вызваны в любом порядке, и уже к результату применен оператор &&. А это уже не так безобидно как умножать по значку "+".
                      Цитата GoldFinch @
                      D_KEY, точно также перегрузка << для потоков меняет сущность оператора сдвига

                      Не точно также. << как был оператором, так им и остался, порядок вычисления и приоритет будет тем же. || && , ?: - "операторами", в принципе, не являются, поскольку управляют последовательностью вычислений. Это специальные языковые формы. Да, я знаю, что в стандарте они значатся, как операторы.
                      Их "перегрузка" таковой не является, поскольку в этом случае ты вводишь уже "настоящий" оператор(в отличие от встроенных версий || && , ?: ), который просто обозначается теми же символоми. Но это совершенно другая языковая конструкция. Ну не перегрузка это.

                      Добавлено
                      Цитата kanes @
                      GoldFinch, сущность поменять можно, но не до абсурда, типа того что перегруженный << на самом деле работает как >> или + работает как умножение

                      Это так. Но я не о том :)

                      Добавлено
                      Цитата sfinae @
                      Мне показалось что D_KEY делал упор не на изменение семантики самой операции, а на изменение семантики в контексте C++ (из-за изменения порядка выполнения).

                      Ага, примерно так.
                      Сообщение отредактировано: D_KEY -
                        Может кто-нибудь объяснить почему опять убрали хэш-контейнеры из нового стандарта.
                          Если я не ошибаюсь, то их никуда не убирали. Они присутствуют в TR1, который, насколько я понимаю, полностью был включен в стандарт. Называются они unordered_xxx
                            Цитата Masterkent @
                            t + sizeof(t) тут не сгодится. Здесь можно было бы использовать boost::end:

                            Извиняюсь :blush: . Поторопился ;) .

                            Цитата
                            Они вполне себе операторы. Операнды у них есть? Есть. Выражения они образуют? Образуют. Чего ещё надо?

                            А можно определение операнда? Просто в контексте С++ у встроенных версий этих операторов операндов нет, поскольку операнды вычисляются до выполнения операции, а для этих операций это не так.

                            Цитата
                            Цитата D_KEY @
                            Их "перегрузка" является введением совершенно иной сущности(нового оператора), но с тем же обозначением.

                            Вообще-то оператор - это и есть обозначение:

                            Цитата ISO/IEC 24765:2008 (Systems and software engineering — Vocabulary)
                            operator. a mathematical or logical symbol that represents an action to be performed in an operation


                            Правильно. Только встроенные версии рассматриваемых "операторов" не являются операциями(фактически ведут себя как выражения). Или я опять ошибаюсь?

                            Цитата
                            Цитата
                            Но в С++ нельзя определять собственные операторы

                            Нельзя вводить новые обозначения и менять приоритеты. Перегрузка операторов не вводит новых обозначений и приоритеты не меняет.

                            А порядок вычислений менять и заставлять вычислять то, что встроенные версии не вычисляют, можно ;) ?
                            Сообщение отредактировано: D_KEY -
                              Цитата Masterkent @
                              Цитата D_KEY @
                              А можно определение операнда?

                              В ISO/IEC 24765:2008 даётся такое определение:
                              Цитата
                              operand. a variable, constant, or function upon which an operation is to be performed

                              И я о том.
                              Цитата
                              Но в C++ операнды не ограничиваются только переменными, константами и функциями. Это могут любые выражения и даже типы.

                              То есть операндом в С++ может являться непосредственно само выражение? Как написать такую функцию?

                              Цитата
                              Цитата D_KEY @
                              поскольку операнды вычисляются до выполнения операции

                              Где такое правило сформулировано?

                              То есть при вызове функций(или операторов) операнды не обязаны быть вычислены до вызова?

                              Цитата
                              Цитата ISO/IEC 24765:2008
                              operation. (1) in computer mathematics, the action specified by an operator on one or more operands; (2) in programming, a defined action that can be performed by a computer system

                              К примеру, вот оно описание действия встроенного оператора &&:

                              Цитата 5.14
                              The operands are both implicitly converted to type bool (clause 4). The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

                              The result is a bool. All side effects of the first expression except for destruction of temporaries (12.2) happen before the second expression is evaluated.

                              Что тут не нравится?

                              То, что это описание "операции" && не соответствует bool * bool -> bool(как должно быть согласно определению "the action specified by an operator on one or more operands"). Вообще, and может быть реализован, как операция над двумя операндами типа bool. Но встроенная версия себя так не ведет.
                              Я не против встроенного поведения, я говорю о том, что перегрузка таких операторов отличается от прочих перегрузок тем, что встроенные версии данных операторов являются специальными языковыми формами, а не обычными операциями(и не могут быть ими заменены). А в результате перегрузки мы вводим именно операцию.
                                Цитата Masterkent @
                                Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

                                Вот собственно и описан предмет возмущения D_KEY.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (77) « Первая ... 30 31 [32] 33 34 ...  76 77


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0659 ]   [ 15 queries used ]   [ Generated: 9.06.24, 10:02 GMT ]