1. C++ / Говнокод #8129

    +153

    1. 1
    2. 2
    3. 3
    4. 4
    auto L = [](int i)->int { return i+1; };
    typedef decltype(L) TL;
    auto lfunc = &TL::operator();
    int i = (L.*lfunc)(1);

    Запостил: ohlol, 08 Октября 2011

    Комментарии (36) RSS

    • разжуйте и посмеемся вместе
      Ответить
      • Лямбда нового стандарта может внезапно оказаться аж целым классом с перегруженным оператором вызова функции.
        Ответить
        • логично
          Ответить
        • Хм...
          http://ideone.com/t67as
          http://ideone.com/3V0h9
          http://ideone.com/bjPuR
          http://ideone.com/fYY6p
          Стандарт как всегда отжигает..
          Ответить
        • Найдите текст: What is the type of lambda? в середине документа:
          http://www.codeproject.com/KB/cpp/cpp10.aspx
          Ответить
      • Ни разу не встречался с синтаксисом лямбд, но всё понял. С++ так хорошо читаем
        Ответить
    • Не знаю почему, но мне вспомнился анекдот про даму с сумочкой, кошелочкой и кошелечком.
      Ответить
      • этот?
        Суд.
        -Подсудимый, за что Вы убили женщину?
        -Еду я в автобусе, подходит кондуктор к женщине, с требованием купить билет.
         Женщина открыла сумочку, достала кошелочку, закрыла сумочку, открыла кошелочку, 
        достала кошелек, закрыла кошелочку, открыла сумочку, положила туда кошелочку, 
        закрыла сумочку, открыла кошелек, достала деньги, открыла сумочку, достала кошелочку,
         закрыла сумочку, открыла кошелочку, положила туда кошелек, закрыла кошелочку, 
        открыла сумочку, положила туда кошелочку.
        - И что?
        - Контролер ей дал билет. Женщина открыла сумочку, достала кошелочку, закрыла сумочку, 
        открыла кошелочку, достала кошелек, закрыла кошелочку, открыла сумочку,
         положила туда кошелочку, закрыла сумочку, открыла кошелек положила туда билет, 
        закрыла кошелек, открыла сумочку, достала кошелочку, закрыла сумочку, 
        открыла кошелочку, положила туда кошелек, закрыла кошелочку, открыла сумочку, 
        положила туда кошелочку, закрыла сумочку. 
        «Возьмите сдачу», раздался голос контролера. Женщина… открыла сумочку…
        - Да убить ее за это мало, - не выдерживает прокурор.
        - Так я это и сделал :))
        Ответить
        • Вот этот больше подходит суда:
          http://govnokod.ru/8128
          (:
          Ответить
        • все решила самым неоптимальным способом
          в таких случаях говорят, нужно оптимизировать алгоритм
          Ответить
        • Ага, он самый.
          Ответить
    • решение через задницу...
      Ответить
      • Это не решение, это синтетика. Заменить ++i; эквивалентным нечитабельным кодом на миллион строк можно было и без нового стандарта...
        Ответить
    • Вот интересно, а что у лямбд с управлением памятью? Ведь по идее лямбды пригодны только в средах со сборщиком мусора, ибо напр. непонятно что делать с контекстом замыкания, он может удалиться до вызова, или во время, самой лямбды. Подсчёт ссылок нередко ведёт к зацикливанию, т.к. часто объект держит ссылку на лямбду, и лямбла держит ссылку на объект. Да и сами лямбды предназначены, чтобы кидаться ими в разные места, в которых непонятно дальше что будет с управлением памяти.

      Предчувствую море дебаго-боли с чем-то вроде:

      "segfault at function functional::blabla<functional::lambda<ra ndom_crap::randomshit>, context::iter, func::<another_random stuff>>"
      Ответить
      • >что у лямбд с управлением памятью?
        Везде с этим всё хорошо. (:

        *что у лямбд в С++ с управлением памятью?
        Лямбды в С++? Не. Не видел. (:
        Это детский сад, а не лямбды. Просто не именованные функции с простейшими замыканиями. Этакая поделка в стиле аля страус труп.
        И уж тем более понятно, что как и во всем С++, управление памятью там ручное.
        Ответить
      • Лямбды C++ предназначены для использования там, где контекст не удалится до вызова. Если нужно иное — пишите явно класс-функтор с умными указателями и подсчётом ссылок.

        А в ногу выстрелить есть множество других способов.
        Ответить
        • *Всё в C++ предназначено для использования там, где контекст не удалится до вызова
          fixed
          Ответить
        • >Лямбды C++ предназначены для использования там, где контекст не удалится до вызова
          Не могу придумать пользы тогда вообще.

          Лямбды полезны тем, что они замыкают свой контекст, и кидаются в другой контекст, позволяя их связывать между собой (характерный пример -- event-driven programming).

          Ежли в С++ они используются там же, где и определены (из того же контекста)... То иного смысла их включать в язык нежели как быть "edgy" на волне моды на функциональщину, не вижу.
          Ответить
          • Думаю, порой они помогают сэкономить десяток строк.
            Ответить
          • Замыкания можно использовать в контекстах уровнем ниже, пока тот, в котором их создали, живой. Например, передать как аргумент в функцию сортировки.

            Аналогично с указателями/ссылками на локальные переменные. Можете их передавать и использовать, пока контекст, в котором они созданы, не умер. Так что ничего нового и неочевидного в плане наступить на грабли не появилось.

            Ну и лямбды, не являющиеся замыканиями, думаю, можно использовать шире.
            Ответить
            • > Например, передать как аргумент в функцию сортировки
              Ну это было всегда решаемо метапрограммированием, например. Или интерфейсами (скажем ISortable + ссылка на виртуальный метод и т.д.)
              Избыточность какая-то.
              Ответить
      • >segfault at function
        Скорее segfault at address (:
        Ответить
    • Стандарту С++ не соответствует.
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий