Кресты / Говнокод #11600 Ссылка на оригинал

0

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

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

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

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

Запостил: HaskellGovno HaskellGovno, (Updated )

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

          • >автор похоже ебанулся
            Интересно, это как-то связано со ссылкой "Функ­ция — ко­но­пля" после статьи?
            Ответить
          • > автор похоже ебанулся

            Процитирую 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.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 к спосо­бу инициализации; в Студии пример откомпилируется и будет работать, чего по стандарту не должно быть.

                    Хм, интересный факт. Спасибо за инфу 😉
                    Ответить
          • Что, ты не знаешь про объекты, которые запрещено копировать?
            Харе придуриваться.
            Ответить
            • в этой теме обсосано уже всё вдоль и поперек
              поэтому что конкретно ты про "= запрещено" имеешь в виду - конструктор копирования в привате, оператор присваивания в привате, корпоративные запреты на = (может твоему начальству приятно глазу только :=, и поэтому использование в любых языках = и == строго запрещено с занесением, следует применять методы eq и ass)
              Ответить
    • > 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 библиотечный, писал его не я и менять не могу.
      Ответить
      • > 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
          результат: я успешен
          Ответить
          • > результат: я успешен
            Да, да, цитирование с тегами.
            Я бы не стал так радикально заявлять. Гляньте, вас же на говнокодике минусуют.
            Ответить
              • Чорд, таки да...
                Не начать ли мне пиписюнческую деятельность, что бы стать успешым?
                Ответить
            • > результат: успешен
              Я лишь процитировал результат компиляции в 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
              Ответить
            • Читать учат в школе. Заканчивай прогуливать.
              HaskellGovno
              > TPrimitive библиотечный, писал его не я и менять не могу.
              Что в этих словах тебе не понятно? Могу пояснить по хардкору.
              Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8