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

    +48

    1. 1
    auto filename = std::string{};

    Запостил: laMer007, 12 Мая 2015

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

    • Ответить
    • Ответить
    • Ответить
    • Ответить
    • А почему именно фигурные?
      Ответить
    • Щитаю недоработка
      auto filename = std::string{'f','i','l','e','n','a','m','e'};
      Ответить
    • Что значит {}?
      Ответить
      • Ты действительно хочешь об этом узнать?
        Ответить
        • На гоатсе не похоже, так что да.
          Ответить
          • Если кратко - это списковый инициализатор из c++11, чтобы писать всякие
            std::vector<int> v { 1, 2, 3, 4 };
            Ответить
            • >списковый инициализатор
              Чем не угодил Arrays.asList(1,2,3,4,5)?
              Ответить
              • Тем, что начнётся та же невменяемая хуйня, что и с Array() в js:
                Array(5) - массив из 5 пустых ячеек
                Array(42, 100500) - массив из двух ячеек со значениями 42 и 100500
                И пришлось делать 2 синтаксиса, чтобы разрулить этот конфликт:
                std::vector<int> a(3, 42); // [42, 42, 42]
                std::vector<int> a{3, 42}; // [3, 42]
                Ну а Arrays.asList() в крестах сделать можно, но особо выгодно. Всё-таки не жаба с её ссылками и GC (хотя перемещающий конструктор должен свести оверхед к нулю).
                Ответить
                • + халявность инициализации
                  Бесплатные скобочки освобождают от написания конструктора.
                  Ответить
                  • struct pod {
                        int x;
                        int y;
                    };
                    pod p { 42, 100500 };
                    Эти скобочки? Это хуёвые скобочки, завязывающие код на деталь реализации (порядок полей в структуре). Не стоит их юзать для чего-то кроме простейших POD'ов.
                    Ответить
                    • > Эти скобочки?
                      Эти.
                      Вроде бы ж ради этого и запиливалось, если я правильно понял.

                      > Схуя
                      Я про лёгкость написания {1,2} вместо конструктора + (1,2).
                      Ответить
                      • Запиливали вроде ради std::initializer_list, который позволяет писать произвольное количество аргументов в скобочки. Но чтобы всё запутать эти { } и как обычный конструктор работают, и как initializer_list и как почленная инициализация...

                        > лёгкость написания {1,2}
                        Эта лёгкость потом ударит по яйцам, когда кто-нибудь поля местами поменяет или добавит между ними ещё одно. И ты заебёшься искать все места, где с лёгкостью писал {1, 2}. Так что только для мелких приватных POD'ов, не более того.
                        Ответить
                        • инициализационные списки придумали для:
                          1. начальной инициализации. Например, это:
                          static const std::vector<std::string> names {"abc", "def", "ghi"};
                          можно написать в хедере класса, не разводя на .cpp и .h, плюс, это единственный способ инициализировать константные контейнеры.
                          2. для перечислений, там, где тебя мало интересует порядок. Пример:
                          for (auto i : {0, 1, 2, 5, 8}) { ... }
                          или, чуть более классическое
                          foreach (auto i, {0, 1, 2, 5, 8}) { ... }

                          я, например, за счет инициализационных списков и оболочки над QVariant реализовал json-подобный синтаксис для формирования json-файлов.
                          Ответить
                      • Ну правда есть ещё такой вариант - добавить к pod'у конструктор, совместимый с его старой раскладкой. Тогда все эти {1, 2} не придётся переписывать. Костыли-костылики.
                        Ответить
                        • > придётся переписывать
                          Для крестобыдла.

                          int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
                          int whitespace[256]
                                 = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
                                     ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
                          struct point p = { .y = 7, .x = 6};
                          struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
                          struct tor p0 = { .y = 7, .x = 6, .z = { .m = 5, .k = 6 } };
                          Ответить
                    • А тут разве знак равенства не надо ставить?
                      Ответить
                      • В старых крестах надо было. В новых и так и так можно.
                        Ответить
                • Однократное выполнение кого-то ебет?
                  Ответить
                  • ?
                    Ответить
                  • Не особо. Но это ж кресты.
                    Ответить
                    • >Это ж язык, который не поддерживает нормальное определение (?) переменных
                      Ответить
                      • А что не так с переменными?
                        Ответить
                        • Почему нельзя написать в инициализацию как в жаве?
                          Ответить
                          • // можно же, начиная с c++11
                            std::vector<int> a { 1, 2, 3 };
                            Ответить
                            • >Чем не угодил Arrays.asList(1,2,3,4,5)?
                              Ответить
                              • В сишке и плюсах в функции с переменным числом аргументов не передаётся это самое число аргументов, функция должна сама догадываться, сколько их должно быть, и какого они типа.
                                Ответить
                                • Ну в общем-то можно накостылить через вариадик шаблоны или, господи прости, макрогенерацию шаблонов до какого-нибудь 20-го уровня, но initializer list получился на порядок вменяемей.
                                  Ответить
                                • varargs не нужен?
                                  Ответить
                                • Подождите, а как же printf?
                                  Ответить
                                  • > varargs не нужен
                                    Ну в сишке больше вариантов нет. А в крестах - да, нинужен.

                                    > а как же printf
                                    Да ёбаный пиздец там. printf() не знает сколько ему параметров передали. Он тупо читает строку формата, и надеется, что программист сделал всё правильно.

                                    В свежих компиляторах есть предупреждение в духе "чувак, у тебя в строке формата 2-й параметр %d, а ты отдал const char *" или "чувак, у тебя в строке формата 2 параметра, а ты отдал один". Само собой, выдаётся оно только для статических строк формата. Всё, больше никаких проверок нет.

                                    Именно поэтому c++11 был глотком свежего воздуха - там и безопасные вариадик шаблоны появились, и initializer list.
                                    Ответить
                                    • >чувак, у тебя в строке формата 2 параметра, а ты отдал один
                                      Ну так. Значит, получает число параметров? Или я туплю и это статический анализатор?

                                      В си есть же литералы массивов?
                                      Ответить
                                      • > это статический анализатор?
                                        Это статический анализатор. В рантайме сишный printf() ничего проверить уже не может.

                                        > литералы массивов
                                        Да есть то они есть. Но их там можно юзать только в инициализации структурок и массивов через =. И больше нигде.
                                        Ответить
                                      • Если мы строку формата передадим не константой, а будем лепить в рантайме, то будет жопа.
                                        Ответить
                                    • Да даже если бустоформат взять. Строку формируешь при выполнении, суёшь неверное число параметров. Что он сделает, кроме ассерта? Компилятор ничем не моможет.
                                      Ответить
                                      • > кроме ассерта
                                        Ну ассёрт или исключение всяко лучше, чем неопределённое поведение.
                                        Ответить
                                    • >> Да ёбаный пиздец там. printf() не знает сколько ему параметров передали. Он тупо читает строку формата, и надеется, что программист сделал всё правильно.

                                      а ведь Ричи гордился принтфом... неужели он... ГОВНОКОДЕР?!!
                                      Ответить
                                      • О покойниках плохо не говорят!!!

                                        Для своего времени было нормально... По-царски. Соглашение cdecl, при котором стек очищался вызывающим кодом, а не вызываемым, позволяло передавать переменное количество параметров. А сколько параметров передано, вызываемая функция должна была угадать. У принтфа как раз строка формата и помогала угадать.
                                        Ответить
                                      • Хотя по сравнению с Delphi, где есть Variant и автоматическая передача размера массива переменной длины, это очень опасная конструкция.
                                        Ответить
                                        • На сколько я слышал раньше были былинные срачи "си против паскаля"
                                          Ответить
                                          • Ну да, а потом Тарас стал крестоблядью, и срачи закончились ;(

                                            Из паскалистов один Стертор, походу, остался.
                                            Ответить
                                            • >> и срачи закончились ;(

                                              Ведь Стретора тупо гнобят, ага
                                              Ответить
                                            • > а потом Тарас стал крестоблядью
                                              так-то маленькая крестоблядь живёт в душе каждого
                                              даже в микросовтодрочерских душонках кегдана и локича
                                              они просто боятся этого в себе
                                              Ответить
                                              • В моей душе нет крестобляди. И в моём душе тоже.

                                                Object Pascal — самый интуитивно понятный язык программирования из относительно популярных.
                                                Ответить
                                                • который медленнее объектного крестокода-2003 минимум на 10%
                                                  а уж чего говорить об оптимизациях, разворачиваниях шаблонов, ссылках и move-семантике
                                                  Ответить
                                                  • Чтобы говнокодить и формошлёпствовать очередную опердень оптимизация не нужна.
                                                    Ответить
                                                  • Скорость в первую очередь определяется архитектурой и алгоритмами, а не языком. Боюсь, что если применять антипаттерны (типа свитч в цикле), то никакой оптимизатор не поможет.
                                                    Ответить
                                                    • Но если архитектура и алгоритмы уже правильные, то в крестокоде 2011 будет больше возможностей прострелить себе ногу улучшить пирфоманс.
                                                      Ответить
                                                    • насколько мне известно, в дельфях объекты даже не пробуют разместиться на стеке, всегда только в куче
                                                      вот уже пенальти пирформанса на пустом месте благодаря референсной имплементации языка

                                                      summon Tarasb
                                                      Ответить
                                                      • Можно разместить и на стеке. Правда, придётся писать слово object вместо class и отказываться от property и прочих удобств...
                                                        Ответить
                                                      • > даже не пробуют
                                                        Там вроде бы остались атавизмы в виде объектов и записей, которые всё-таки можно размещать на стеке. Нельзя только классы, которые от TObject порождены. Да-да, язык настолько интуитивный, что в нём 3 способа описать хрень-с-полями.
                                                        Ответить
                                                      • А как размещение в куче портит перфоманс? Выделение? Ну, используй свой ололокатор XD
                                                        Ну и понятно, что для TPoint или для TComplexNumber надо брать object, а не class.
                                                        Ответить
                                                        • >А как размещение в куче портит перфоманс? Выделение? Ну, используй свой ололокатор XD
                                                          Ну и понятно, что для TPoint или для TComplexNumber надо брать object, а не class.

                                                          В стэке выделение памяти будет простым sub esp, N(или что-то типа того) и вызов конструктора. Ололактор - это же как минимум вызов функции, поиск свободной памяти итд. Плюс стэк будет находится в кэше процессора и не придется подгружать данные из памяти.
                                                          Ответить
                                                          • Для временных объектов это понятно. Для них структуры используй.
                                                            Для объектов покрупнее локальности тебе и не будет.
                                                            Ответить
                                                        • размещение в куче - аллокация и деаллокация (время), фрагментация кучи (время), плохая локальность (когда все текущие объекты расположены близко друг от друга, компьютер начинает работать быстрее, ибо кешлайн)

                                                          > Ну, используй свой ололокатор XD
                                                          т.е. надо сильно напрячь анус, чтобы попытаться догнать крестоблядство, в котором это всё просто из коробки работает, т.к. можно в стековые объекты?
                                                          Ответить
                                                          • Ну как-то так, а вообще мне пох, я структурами пишу.
                                                            Ответить
                                                    • > свитч в цикле
                                                      switch (n & 7) {
                                                      case 0: while (n > 0) { n-= 8;
                                                              out(*s++);
                                                      case 7: out(*s++);
                                                      case 6: out(*s++);
                                                      case 5: out(*s++);
                                                      case 4: out(*s++);
                                                      case 3: out(*s++);
                                                      case 2: out(*s++);
                                                      case 1: out(*s++);
                                                          }
                                                      }
                                                      Свитч в цикле или цикл в свитче?
                                                      Ответить
                                                      • Кручу-верчу, запутать хочу! Паскаль и его диалекты хороши уже тем, что на них ТАК написать нельзя.
                                                        Ответить
                                                        • в смысле?
                                                          в паскале нет goto?
                                                          Ответить
                                                          • 100% есть
                                                            Ответить
                                                          • гото есть, но цикл со свичом скрестить нельзя
                                                            я даже не знаю, как это говно выглядит на АСТ-дереве, не могу представить
                                                            Ответить
                                                            • > как это говно выглядит на АСТ-дереве
                                                              switch - это же просто лапша из goto. Так что выглядит как лапша из goto. Наверное.
                                                              Ответить
                                                              • А я-то дурак думал, что свич - это узел с несколькими ветками. Но это наверное лишь в нормальных языках так.
                                                                Ответить
                                                                • > свич - это узел с несколькими ветками
                                                                  А вот хуй там. Это блок, в который приземляется куча goto (выходящих из узла с несколькими ветками, да). Вспомни про break, без которого код тупо проваливается в следующую ветку.
                                                                  Ответить
                                                                • Да, в сраной сишке свич — это не элемент структурного программирования. Это тупо набор меток и условный оператор перехода. Это реинкарнация goto и макаронного кода.

                                                                  Сишку же и разрабатывали как замену Ассемблеру, поэтому о структурной питушне не всегда думали.
                                                                  Ответить
                                                                  • Сишку разрабатывали как инструмент для себя, поэтому не думали о защите от долбоебов
                                                                    Ответить
                                                                    • Её даже называли write-only... пока не придумали другие языки, которые ещё более write-only.
                                                                      Ответить
                                                            • Кстати, когда я попробовал засунуть класс внутрь свича и воткнуть метку внутрь его конструктора, gcc свалился и попросил рассказать об этом разрабам. (Последние версии уже не падают, а пишут "ты куда это метку засунул?").
                                                              Ответить
                                                            • В жавке - таблица переходов, поэтому O(1), а в сишке?
                                                              Ответить
                                                    • >антипаттерны (типа свитч в цикле),
                                                      А в сишке свич не за O(1)?
                                                      Ответить
                                                      • Бля, мы не про O(...), мы про устройство Даффа, тебя в нём ничего не смущает?
                                                        Ответить
                                                  • > который медленнее объектного крестокода-2003 минимум на 10%

                                                    Да похер, объектный или нет, там текстурирование линии занимало большую часть времени.
                                                    Ответить
                                                • php интуитивней.
                                                  Ответить
                                                  • > php интуитивней.
                                                    Ебанись. С этой коллекцией костылей и граблей разве что кресты могут посоревноваться.
                                                    Ответить
                                                    • Кресты вне конкуренции
                                                      А ПХП держит второе место с большим отрывом с обеих сторон

                                                      Даже тут он не первый...
                                                      Ответить
                                                    • следи за развитием php bormand.
                                                      Там уже все в норму приходит. Даже GC прикрутили.
                                                      Ответить
                                                      • В этом-то и проблема: расмус только прикручивает и никогда ничего не откручивает.
                                                        Ответить
                                                        • в том то и дело что откручивает. Ебись потом с этим
                                                          Ответить
                                                          • И что он существенного выпилил за последние 10 лет?
                                                            Ответить
                                                            • win-1251.
                                                              mssql
                                                              mysql_
                                                              function a(&$a,&$b){}
                                                              раньше
                                                              a(&$a,&$b);
                                                              теперь и никак иначе.
                                                              a($a,$b);

                                                              а еще вот по моему это сомнительно конечно.

                                                              но теперь если в предке в метод передается 1 параметр
                                                              то в наследнике в одно именном методе должен быть только один параметр.
                                                              Ответить
                                                              • >win-1251
                                                                Поясните мысль. (с)

                                                                >mysql_
                                                                ~# php -r 'print_r(get_defined_functions());' | grep mysql_
                                                                            [1323] => mysql_connect
                                                                            [1324] => mysql_pconnect
                                                                            [1325] => mysql_close
                                                                            # ... и ещё овер 9000
                                                                ~# php -v
                                                                PHP 5.6.7-1 (cli) (built: Mar 24 2015 12:30:15) 
                                                                Copyright (c) 1997-2015 The PHP Group
                                                                Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
                                                                    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
                                                                    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans


                                                                >mssql_
                                                                ok

                                                                >a(&$a,&$b);
                                                                ok

                                                                >но теперь если в предке в метод передается 1 параметр
                                                                то в наследнике в одно именном методе должен быть только один параметр

                                                                E_STRICT, не более того

                                                                Для десяти лет получается довольно скромный список. А сколько говнофич было добавлено? Сколько пизданутых опций появилось в блядском php.ini?
                                                                Ответить
                                                                • >win-1251
                                                                  по дефолту строковые функции стали использовать utf-8
                                                                  E_STRICT
                                                                  Не отключается это теперь.
                                                                  Ответить
                                                                  • >по дефолту строковые функции стали использовать utf-8
                                                                    Но при этом mb_*-говно как было так и осталось.
                                                                    >Не отключается это теперь
                                                                    /facepalm. E_STRICT у них не отключается. Вообще охуеть.
                                                                    Ответить
                                                                • >Для десяти лет получается довольно скромный список
                                                                  Не стоит забывать это то, что я вспомнил за пару минут пока писал. Если посмотреть изменения от 5.1 до 5.5. убрано достаточно много.
                                                                  Ответить
                                                              • Охблядь, нытик. Проблема разве что что он на замену ничего вменяемого не прикрутил.
                                                                Ответить
                                                      • > Там уже все в норму приходит.
                                                        Ага. Перечисли, пожалуйста, какие костыли и грабли были удалены из PHP за последние 10 лет.

                                                        В общем-то в крестах та же трабла - ради совместимости всё-всё-всё остаётся на месте. Только новые фишки добавляются.
                                                        Ответить
                                                        • проблема еще и в комьюнити, которое не может просто взять и перестать есть говно, юзать сомнительные техники и бить себя костылями по голове
                                                          Ответить
                                                        • чуть выше ответил
                                                          Ответить
                                                        • В жаве хоть есть @deprecated, который подсвечивается в ide.
                                                          Ответить
                                                    • А как же ЭКМАСкрипт, в котором даже for .. in с подвохом?
                                                      Ответить
                                • > В плюсах в функции с переменным числом аргументов не передаётся это самое число аргументов

                                  про вариадик ты конечно забыл sizeof... легко выдает число параметров
                                  Ответить
                                  • > про вариадик ты конечно забыл sizeof...
                                    Пример кода можно? На c++98 само собой.

                                    sizeof... же вместе с вариадик шаблонами появился.

                                    Ну и вариадик с sizeof... будет ПОД КАЖДЫЙ ВЫЗОВ КОМПИЛИТЬ НОВУЮ ФУНКЦИЮ. А initializer_list - нет.
                                    Ответить
                                    • > ПОД КАЖДЫЙ ВЫЗОВ КОМПИЛИТЬ НОВУЮ ФУНКЦИЮ красным цветом

                                      ну ты и быдло. только оно считает число скомпилированных функций. и причем тут срр98? на дворе уже 2015 на тот случай если ты еще не заешь
                                      Ответить
                              • Чем не угодил std::vector<int> a { 1,2,3,4,5}?
                                Ответить
                              • >Чем не угодил Arrays.asList(1,2,3,4,5)?
                                быдлятно сильно
                                в классе МАССИВЫ вызывается член КАК СПИСОК для преобразования из ПАРАМЕТРОВ в СПИСОК

                                ну а в общем кроме названного борми: например создатели буста в своей уютной конфочке батхертели от std::make_unique, что создается 100500 шаблонов на каждую комбинацию аргументов
                                Ответить
                                • Не понел.
                                  Ответить
                                  • спать иди
                                    Ответить
                                    • Выспался, все равно не понял.
                                      Ответить
                                      • Иди странствуй восемь лет.
                                        Ответить
                                        • За них вы научитесь внятно объяснять?
                                          Ответить
                                          • >>За них вы научитесь внятно объяснять?
                                            попутного ветра
                                            Ответить
                                          • да, ты главное не оборачивайся
                                            Ответить
                                          • Видишь, там на горе возвышается крест.
                                            Под ним крестовый стандарт, повиси-ка на нём,
                                            А когда надоест, возвращайся назад
                                            Писать на скриптах, писать на скриптах,
                                            Писать на скриптах со мной.
                                            Ответить
                          • И вот так даже можно:
                            void test(const std::vector<int> & a, const std::set<int> & b) {
                                // ...
                            }
                            
                            test({1, 2, 3}, {4, 5, 6});
                            http://ideone.com/sOrv7R

                            Теперь жавабляди соснули? :)
                            Ответить
                            • а ты сделай это для параметров шаблонов и оно адекватно работать не будет
                              Ответить
                              • Ну там придётся test(std::vector<int>{1,2,3}) писать. Как и в любом другом случае, когда тип с обоих сторон адаптироваться умеет.
                                Ответить
                                • не сработает
                                  Ответить
                                  • > не сработает
                                    Почему? Тип известен - std::vector<int>. Нормально компилится.

                                    http://ideone.com/Ln8gMH
                                    Ответить
                          • Помнится, кто-то хотел литерал для map'а? Держи:
                            test({{"name", "Vasya"}, {"length", "17"}});
                            http://ideone.com/1mQ3tK

                            А если boost::any или boost::variant во втором параметре мапа поюзать - то и типы можно будет произвольные передать...
                            test({{"name", "Vasya"}, {"length", 17}});
                            Ответить
            • И списковый инициализатор, и обычный конструктор.
              Что написал выше можно породить из const char*.

              auto filename = std::string{"filename"};
              Ответить
              • Там же ещё, вроде бы, "filename" проканывает под инициалайзер лист из чаров?
                Ответить
          • Это множество. Или словарь.
            Ответить
            • // множество
              std::set<int> s { 1, 2, 3 };
              // или словарь
              std::map<std::string, int> m {
                  { "a", 2 },
                  { "b", 4 }
              };
              Ответить
              • Кмк, в связке uniform initializer + initializer list комитет облажался. Например, если есть перегрузка c инит-листом, компилятор всегда пытается выбрать перегрузку с инит-листом. Даже если она не компиляется. Только путают людей.
                Ответить
                • Ну а иначе будет та же фигня, что и в js - Array(5) это [,,,,], а Array(5, 1) это [5,1]. В крестах, по крайней мере, в обоих случаях сработает initializer list и всё будет хотя бы единообразно. А обычный конструктор доступен через круглые скобки.

                  Но сама идея с uniform initializer мне вообще не нравится. Путаницы много создаёт.
                  Ответить
                  • Мне кажется, можно было бы сделать так:
                    T obj { {1, 2, 3} };
                            ^
                            initializer list
                    Тогда вроде путаницы не должно было быть.
                    Ответить
                    • Можно, но скобок одинаковых дохера получается :(

                      Тогда уж
                      T obj ( {1, 2, 3} );
                      Ответить
                      • А наружные скобки - это что?
                        Ответить
                        • Ну собственно от самой инициализации, как в std::string s("хуй") или std::string("хуй").
                          Ответить
                          • Я к тому, что у романа они фигурные. Круглые то понятно. Или в плюсах и так и так можно?
                            Ответить
                            • > Или в плюсах и так и так можно?
                              Да, чтобы майндфака было побольше. Ну и { } чуть более строгие, чем ():
                              char x(1000); // обрежется под один байт
                              char x{1000}; // выдаст ошибку компиляции
                              Вот все допустимые варианты: http://en.cppreference.com/w/cpp/language/list_initialization
                              Ответить
                              • Так много свободы, что пиздец
                                Ответить
                                • Ага. В с++11 столько новых применений для всяких разных скобок нашлось ;)

                                  a{ } - новый инициализатор, [](){} и []{} - лямбды, >> - закрывашка от шаблона.
                                  Ответить
                                  • А баянчик [|x|] как в F# для массивов когда введут? Непорядок.
                                    Ответить
                                    • А что он делает? list comprehension?
                                      Ответить
                                      • По-моему, просто литерал массива. [] - список, [||] - массив.

                                        P.S. list comprehension тоже есть
                                        let array1 = [| 1; 2; 3 |]
                                        let array3 = [| for i in 1 .. 10 -> i * i |]

                                        https://msdn.microsoft.com/ru-ru/library/dd233214.aspx
                                        Ответить
                                        • Подобие второго есть в c++14
                                          http://en.cppreference.com/w/cpp/utility/integer_sequence
                                          Ответить
                                      • > А что он делает?
                                        Просто литерал, нотацию из Ocaml позаимствовали.
                                        Ответить
                      • > но скобок одинаковых дохера получается

                        Да не то чтобы прям много, зато однозначно всё, и можно всюду юзать одни и те же фигурные скобки, а не напрягать мозг каждый раз: какие же скобки тут удобнее и правильнее?
                        Ответить
                        • > можно всюду юзать одни и те же фигурные скобки, а не напрягать мозг каждый раз: какие же скобки тут удобнее

                          а зачем напрягать? их всего два вида для инициализации
                          Ответить
                          • И геммор с шаблонными forwarding функциями вроде make_shared. Какие скобки там нужно использовать для конструирования объектов? В зависимости от используемых скобок будет разная семантика.
                            Ответить
    • Ответить

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