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

    +7

    1. 1
    TPrimitive a((TLine())), b((TCircle()));

    Вынужденный говнокод.
    Должно быть:

    TPrimitive a(TLine()), b(TCircle());

    Но это будет объявлением 2х указателей на функции.

    Запостил: HaskellGovno, 16 Августа 2012

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

    • Я не говнокодер, но меня заставляют!
      Ответить
      • а = религия не позволяет поставить?
        Ответить
        • и "b = " тоже
          Ответить
        • вот тут автор не рекомендует инициализировать объект пристваиванием
          http://iproc.ru/2012/08/cpp-copy-constructor/
          Ответить
          • Вот, умный человек, знающий стандарт, пришел.
            Ответить
          • автор похоже ебанулся
            http://ideone.com/rQTUO
            Ответить
            • >автор похоже ебанулся
              Интересно, это как-то связано со ссылкой "Функ­ция — ко­но­пля" после статьи?
              Ответить
            • > автор похоже ебанулся

              Процитирую C++98 12.6.1 Explicit Initialization
              An object of class type can be initialized with a parenthesized expression-list, where the expression-list is
              construed as an argument list for a constructor that is called to initialize the object. Alternatively, a single
              assignment-expression can be specified as an initializer using the = form of initialization.


              Автор точно ебанулся. Там же в стандарте и пример есть, в котором Complex инициализируют тройкой.

              P.S. Комментарий от автора статьи
              Всё ска­зан­ное здесь не от­но­сит­ся к Visual Studio. В этой си­сте­ме, во­пре­ки стан­дар­там, ини­циа­ли­за­ция ра­вен­ством эк­ви­ва­лент­на ини­циа­ли­за­ции скоб­ка­ми
              Как-будто в gcc не так...
              Ответить
              • P.P.S. Инициализация равенством... Так чтоли?
                a == 5
                Ответить
                • Это сравнение. Равенство в математике.
                  Ответить
                  • ну уж = - точно не равенство
                    императивное присваивание

                    P.S. Из ЯП самые годные равенства в MetaFont - они умеют решать линейные уравнения (присваивание там осуществляется отдельным оператором :=)
                    *c+2b=1; 
                    *2c+4b=1;
                    Ответить
              • пришлось самому поковырять
                будем честны

                стандарт различает direct-initialization (mytype a(1);) от copy-initialization (mytype a = 1;) - например, 8.5/14 + 12.3.1
                но в том же 8.5/14 написано про copy-initialization In certain cases, an imple-mentation is permitted to eliminate the copying inherent in this direct-initialization by constructing
                the intermediate result directly into the object being initialized; see 12.2, 12.8.
                Ответить
                • The function selected is called with the initializer expression as its argument; if the func-
                  tion is a constructor, the call initializes a temporary of the destination type. The result of the call
                  (which is the temporary for the constructor case) is then used to direct-initialize, according to the
                  rules above, the object that is the destination of the copy-initialization.


                  Семантика такова, что создается временная переменная (хотя компилятор, конечно, может этим и не заниматься)... Т.е. автор все-таки был прав, что copy-initialization может оказаться медленнее, чем direct-initialization.

                  P.S. Но вот "вопреки стандарту" автору я не прощу ;)
                  P.P.S. Вот за что я люблю и одновременно ненавижу с++ - так это то, что каждый месяц я узнаю какую-нибудь новую его тонкость.
                  Ответить
                  • (Я тот самый автор)

                    Вам довелось наткнуться на довольно сырой вариант статьи, с которым я и сам уже не согласен. С тех пор я многое исправил, в том числе терминологию, цитаты из стандарта, изменил общий тон в сторону более нейтральной точки зрения.
                    Ответить
                    • Код выше — как раз тот случай, когда проявляется безразличие компилятора Visual Studio к спосо­бу инициализации; в Студии пример откомпилируется и будет работать, чего по стандарту не должно быть.

                      Хм, интересный факт. Спасибо за инфу ;)
                      Ответить
                      • с включенным /Za (Disable Language Extensions) ругается, как и положено
                        но этим флагом обычно никто не пользуется
                        Ответить
        • А если = запрещено?
          Ответить
          • поясните мысжль
            Ответить
            • Что, ты не знаешь про объекты, которые запрещено копировать?
              Харе придуриваться.
              Ответить
              • в этой теме обсосано уже всё вдоль и поперек
                поэтому что конкретно ты про "= запрещено" имеешь в виду - конструктор копирования в привате, оператор присваивания в привате, корпоративные запреты на = (может твоему начальству приятно глазу только :=, и поэтому использование в любых языках = и == строго запрещено с занесением, следует применять методы eq и ass)
                Ответить
    • TPrimitive a = TLine(), b = TCircle();
      Ответить
      • > defecate-plusplus 29 минут назад
        > Dummy00001 7 минут назад
        Ви, таки, комментариев не читаете?
        Ответить
        • нет, просто страйко запилил помимо цитирования с тегами ещё и ответ на пост по почте
          Ответить
        • Да скорее всего делает так же как я - открывает все интересные темы в стоке, а потом по одной вкладке читает. В результате одна из вкладок остается отставшей минут на 5-10...
          Ответить
        • > Ви, таки, комментариев не читаете?

          читаю. но честно говоря я и не уловил что defecate-plusplus хотел сказать.

          "Talk is cheap. Show me the code" (c) Linus Torvalds
          Ответить
          • это и хотел сказать
            еще хотел сказать, что если конструктор explicit, то букв получится больше, чем ожидается - но мне было лениво

            но тут проблема высосана из пальца - какие то пустые конструкторы передаются - так что говнокод не в синтаксисе, а глубже
            Ответить
            • Ага, странная архитектура. Интересно было бы посмотреть на конструктор TPrimitive. Ну и на TLine, к примеру.
              Ответить
              • >Интересно было бы посмотреть на конструктор TPrimitive
                boost::variant<_>::variant найдешь в гугле
                Ответить
      • defecate-plusplus
        Dummy00001
        >TPrimitive a = TLine(), b = TCircle();
        http://ideone.com/2sfxa
        prog.cpp:18: error: conversion from ‘TLine’ to non-scalar type ‘TPrimitive’ requested
        prog.cpp:18: error: conversion from ‘TCircle’ to non-scalar type ‘TPrimitive’ requested

        TPrimitive библиотечный, писал его не я и менять не могу.
        Ответить
        • explicit?
          Ответить
        • > http://ideone.com/2sfxa

          так а где все определения? ясно что на пустом примере оно работать не будет.

          то что defecate про explicit говорит, и что для 100% надежности я должен был написать, выглядит вот так:
          TPrimitive a = TPrimitive(TLine());
          TPrimitive b = TPrimitive(TCircle());
          Ответить
          • Ты сравни своё длинное не рабочее говно и моё короткое и успешное:
            > TPrimitive a = TPrimitive(TLine());
            > TPrimitive b = TPrimitive(TCircle());
            http://ideone.com/5aOXM
            prog.cpp:18: error: no matching function for call to ‘TPrimitive::TPrimitive(TPrimitive)’
            prog.cpp:19: error: no matching function for call to ‘TPrimitive::TPrimitive(TPrimitive)’



            TPrimitive a((TLine())), b((TCircle()));
            http://ideone.com/SQDyX
            результат: я успешен
            Ответить
            • да, explicit копирующий конструктор - это ок
              Ответить
            • > результат: я успешен
              Да, да, цитирование с тегами.
              Я бы не стал так радикально заявлять. Гляньте, вас же на говнокодике минусуют.
              Ответить
              • А вас почти не минусуют. Значит он успешней.
                Ответить
                • Чорд, таки да...
                  Не начать ли мне пиписюнческую деятельность, что бы стать успешым?
                  Ответить
              • > результат: успешен
                Я лишь процитировал результат компиляции в ideone.com
                Ответить
                • На ideone
                  1. Нет болда
                  2. Пишут "успешно", а не "успешен"
                  3. Не пишут местоимение "я успешен", которое вы так аккуратно затёрли при цитировании с тегами, что бы снять с себя подозрение.
                  Так что ваше "лишь процитировал" - враки. Не цитата это.
                  Но все ходы записаны, изначально было
                  >> результат: я успешен
                  Ответить
                  • Ааа! Дак это ты тот самый модератор и отредактировал мои посты. Я знаю, что ты знаешь, мой айпи. По всему видно, что уже вычи слил.
                    Ответить
            • > результат: я успешен

              в чем ты успешен??? в том что ты две функции - a и b - объявил?

              оно у тебя компилируется потому что ничего не делает.

              ГК сверху как раз есть (кривоватая и непортабельная) попытка создать два объекта - a и b.
              Ответить
              • >в том что ты две функции - a и b - объявил?
                Lolshito?
                Оно компилируется так как и задумывалось. Какие функции? Стандарт языка что-ли ещё наизусть не выучил?
                Вот доказательство, что-никаких функций a и b нет:
                http://ideone.com/67pPg
                cout<<typeid(a).name()<<endl;
                cout<<typeid(b).name()<<endl;
                > TPrimitive
                > TPrimitive
                Ответить
            • http://ideone.com/wAMOK
              Ответить
              • Читать учат в школе. Заканчивай прогуливать.
                HaskellGovno
                > TPrimitive библиотечный, писал его не я и менять не могу.
                Что в этих словах тебе не понятно? Могу пояснить по хардкору.
                Ответить
    • Т.е. срезка тебя не беспокоит?
      Ответить

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