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

    +161

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    int b;
    int c();
    
    template<class u, class v>
    struct IsSameType
    {
    	enum {r=0};
    };
    
    template<class u>
    struct IsSameType<u,u>
    {
    	enum {r=1};
    };
    
    //...
    cout<<IsSameType<decltype(b),decltype(c())>::r<<endl;
    cout<<IsSameType<decltype(b),decltype((b))>::r<<endl;
    cout<<IsSameType<decltype(c()),decltype((b))>::r<<endl;

    Сегодня увидим новую плюшку, что нам подарил новый стандарт С++0х.
    1)Что на экране получим после выполнения данной программы?
    2)Какие реально decltype возвращает типы в данных случаях?
    Желательно ответить на оба вопроса, не компилируя. ^_^

    Запостил: Говногость, 21 Августа 2011

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

    • *Достаёт попкорн*
      *Ответ не знаю(*
      Ответить
    • Не выдержал и запустил компилятор MS VS 2010, дописав:
      cout<<IsSameType<decltype(c()),decltype((c()))>::r<<endl;
      cout<<typeid(decltype(b)).name()<<endl;
      cout<<typeid(decltype((b))).name()<<endl;
      cout<<typeid(decltype(c())).name()<<endl;
      cout<<typeid(decltype((c()))).name()<<endl;
      Противоречие компилятора майкрософта самому себе поражает и я до сих пор не знаю, что там скрывается за типами, возвращаемыми decltype((
      Ответить
      • Жесть.
        Ответ нашёл, попытавшись скомпилировать следующее:

        decltype((b)) v2 = 0;

        Осталось найти, что и где об этом говорит стандарт.
        Ответить
        • .
          Ответить
        • Этот кашмарный (от слова каша) стандарт громоздок на столько, что смертельно замучает бедных создателей компиляторов.
          Ответить
          • А ещё он измучает всех программистов С++ и поставит жирный крест на карьере С++, как языка для школьниц.
            Ответить
        • Наглядней вот так:

          cout << IsSameType<int&, decltype((b))>::r << endl;
          cout << IsSameType<int,  decltype((b))>::r << endl;
          
          cout << IsSameType<int&, decltype(b)>::r << endl;
          cout << IsSameType<int,  decltype(b)>::r << endl;


          а почитать можно для начала википидию.
          http://en.wikipedia.org/wiki/Decltype#Semantics
          Ответить
          • "...while at the same time being intuitive for novice programmers..." (c)

            Офигеть интуитивность. Следующие строчки не эквивалентны, если foo() возвращает ссылку:

            auto v = foo(); // копирование значения
            decltype(foo()) v = foo(); // сохранение ссылки

            ЭТО интуитивно?..
            Ответить
            • Это называется горе от ума
              Ответить
              • Как бы оно ни называлось, предсказываю, что подобное поведение auto в скорости приведёт к тоннам говнокода, случайно копирующего то, что копироваться не должно в принципе...
                Ответить
                • для того что копироваться не должно в принципе копирование должно быть запрещено.
                  Ответить
                  • Большую часть кода на С++ пишут люди, не умеющие соблюдать даже школьные 3 принципа ООП, не говоря уже о минимальной конст-корректности. А мы тут про какие-то принципы... Нам же всё это потом за ними и дебажить, если "повезёт".
                    Ответить
                    • Плохо, конечно, за ними потом все дебажить, но главное самому не плошать. Куда уж деваться-то.
                      Хотя чую я, что уж хамяки - стандарт сам говна подкинет, вернее авторы.
                      Ответить
            • Прям какое-то гавно на уровне стандарта, ей богу.
              Ответить
              • Это вообще какая то диверсия в комитете С++. Бомба замедленного действия от функционалистов...
                Ответить
        • Ни за какие деньги не переквалифицируюсь в C++ программиста... Хоть Страуструпа и прочитал (и перечитал), писать на _этом_ я не буду.
          Ответить
          • Вот и хорошо. Писать на _этом_ должны только те, кто к _этому_ морально готов.
            Ответить
            • Да, я не хочу разбирать наборы скобочек, палочек и закорючек в поисках глубокого божественного смысла. В C++ лично мне сложно в мельчайших деталях понимать, что-же именно происходит. Понятно, конечно, что с опытом приходит. Да, можно писать довольно кратко и общо, но любой непосвящённый будет неделю разбираться в таком коде. В C или Java в этом плане как-то проще и приятнее, и у них есть свои недостатки. Каждому своё :)
              Ответить
              • > Каждому своё :)

                Да я только за. Чем больше людей сами понимают свои желания, предпочтения и ограничения - тем меньше за ними потом разгребать.

                Да, и на С++ тоже вполне можно писать просто и понятно даже для не особо посвящённых. Только 90% возможностей языка при этом использоваться не будут. И совсем не факт, что такая "понятность" пойдёт в плюс удобству и простоте поддержки.
                Ответить
          • а на чем, пардон, пишете?
            Ответить
            • Судя по личной кабинке - на жабе.
              Ответить
              • И я его не могу не понять.
                Ответить
                • Мне когда-то довелось пописать под Симбиан. После этого я могу понять кого угодно.
                  Ответить
                  • Теперь я знаю кто нассал под симбиан йохохо
                    Ответить
                    • Это было самое меньшее, что я мог для него сделать после всего, что между нами было.
                      Ответить
                • Кстати, у вас не воникает ощущения, что вы пишете на богоизбранном языке, великом, мощнейшем и всеобъемлющем, и что приверженцы, к примеру, java - глуповатые бездари, неспособные прозреть и узреть его могучую силу?
                  Ответить
                  • А как вы догадались? Так и есть. (:
                    Ответить
                    • http://1.bp.blogspot.com/_ACObF28sOjU/TR8nTFXeMGI/AAAAAAAAACA/lI2GuPWjfbM/s640/c%252B%252B_21.PNG
                      Вдруг вы ещё не видели :)
                      Ответить
            • По работе - java и javascript (года полтора писал на C), для души изучаю haskell, python, scala, elisp. На php тоже писать приходилось, но удовольствия мало. Ну и, конечно, в процессе чтения sicp пришлось ознакомиться со scheme.
              Ответить
              • python? попробуйте еще ruby. Правда, скорость оставляет желать лучшего, но для эстетики.... любой говнокод на ruby прекрасен = )
                Ответить
                • У меня была мысль изучить ruby (на самом деле больше для опробирования RoR, ибо есть довольно приятный опыт работы с Grails), но времени на всё не хватает. Может, чуть позже, меня пока больше интересуют haskell и Scala.
                  Ответить
        • зато
          decltype((b) + (b)) v2 = 0;

          компилиться, так что мы все спасены!

          ваш, КО
          Ответить
          • Ну так (b)+(b) - это не lvalue, а смайлик. Потому и компилится.
            Ответить
    • - Самому по сути (это в идеале) нужен синтаксис C++ 6.00
      - Это тот, где переменная, объявленная в заголовке цикла остаётся видна после него, а шаблоны настолько кастрированны, что на них даже факториал не напишешь? Ты мазохист, чтоли? Хотя что я спрашиваю, ты же программируешь на С++, всё и так ясно.
      Ответить
    • показать все, что скрытоvanished
      Ответить

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