- 1
auto filename = std::string{};
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+48
auto filename = std::string{};
Чем не угодил Arrays.asList(1,2,3,4,5)?
Бесплатные скобочки освобождают от написания конструктора.
Эти.
Вроде бы ж ради этого и запиливалось, если я правильно понял.
> Схуя
Я про лёгкость написания {1,2} вместо конструктора + (1,2).
> лёгкость написания {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-файлов.
Для крестобыдла.
Гццблядство! Нипастандарту.
Ну в сишке больше вариантов нет. А в крестах - да, нинужен.
> а как же printf
Да ёбаный пиздец там. printf() не знает сколько ему параметров передали. Он тупо читает строку формата, и надеется, что программист сделал всё правильно.
В свежих компиляторах есть предупреждение в духе "чувак, у тебя в строке формата 2-й параметр %d, а ты отдал const char *" или "чувак, у тебя в строке формата 2 параметра, а ты отдал один". Само собой, выдаётся оно только для статических строк формата. Всё, больше никаких проверок нет.
Именно поэтому c++11 был глотком свежего воздуха - там и безопасные вариадик шаблоны появились, и initializer list.
Ну так. Значит, получает число параметров? Или я туплю и это статический анализатор?
В си есть же литералы массивов?
Это статический анализатор. В рантайме сишный printf() ничего проверить уже не может.
> литералы массивов
Да есть то они есть. Но их там можно юзать только в инициализации структурок и массивов через =. И больше нигде.
List list = as_list({1,2,3,4,5})
Ну ассёрт или исключение всяко лучше, чем неопределённое поведение.
а ведь Ричи гордился принтфом... неужели он... ГОВНОКОДЕР?!!
Для своего времени было нормально... По-царски. Соглашение cdecl, при котором стек очищался вызывающим кодом, а не вызываемым, позволяло передавать переменное количество параметров. А сколько параметров передано, вызываемая функция должна была угадать. У принтфа как раз строка формата и помогала угадать.
Из паскалистов один Стертор, походу, остался.
Ведь Стретора тупо гнобят, ага
так-то маленькая крестоблядь живёт в душе каждого
даже в микросовтодрочерских душонках кегдана и локича
они просто боятся этого в себе
Object Pascal — самый интуитивно понятный язык программирования из относительно популярных.
а уж чего говорить об оптимизациях, разворачиваниях шаблонов, ссылках и move-семантике
вот уже пенальти пирформанса на пустом месте благодаря референсной имплементации языка
summon Tarasb
Там вроде бы остались атавизмы в виде объектов и записей, которые всё-таки можно размещать на стеке. Нельзя только классы, которые от TObject порождены. Да-да, язык настолько интуитивный, что в нём 3 способа описать хрень-с-полями.
Ну и понятно, что для TPoint или для TComplexNumber надо брать object, а не class.
Ну и понятно, что для TPoint или для TComplexNumber надо брать object, а не class.
В стэке выделение памяти будет простым sub esp, N(или что-то типа того) и вызов конструктора. Ололактор - это же как минимум вызов функции, поиск свободной памяти итд. Плюс стэк будет находится в кэше процессора и не придется подгружать данные из памяти.
Для объектов покрупнее локальности тебе и не будет.
> Ну, используй свой ололокатор XD
т.е. надо сильно напрячь анус, чтобы попытаться догнать крестоблядство, в котором это всё просто из коробки работает, т.к. можно в стековые объекты?
в паскале нет goto?
я даже не знаю, как это говно выглядит на АСТ-дереве, не могу представить
switch - это же просто лапша из goto. Так что выглядит как лапша из goto. Наверное.
А вот хуй там. Это блок, в который приземляется куча goto (выходящих из узла с несколькими ветками, да). Вспомни про break, без которого код тупо проваливается в следующую ветку.
Сишку же и разрабатывали как замену Ассемблеру, поэтому о структурной питушне не всегда думали.
А в сишке свич не за O(1)?
Да похер, объектный или нет, там текстурирование линии занимало большую часть времени.
Ебанись. С этой коллекцией костылей и граблей разве что кресты могут посоревноваться.
А ПХП держит второе место с большим отрывом с обеих сторон
Даже тут он не первый...
Там уже все в норму приходит. Даже GC прикрутили.
mssql
mysql_
function a(&$a,&$b){}
раньше
a(&$a,&$b);
теперь и никак иначе.
a($a,$b);
а еще вот по моему это сомнительно конечно.
но теперь если в предке в метод передается 1 параметр
то в наследнике в одно именном методе должен быть только один параметр.
Поясните мысль. (с)
>mysql_
>mssql_
ok
>a(&$a,&$b);
ok
>но теперь если в предке в метод передается 1 параметр
то в наследнике в одно именном методе должен быть только один параметр
E_STRICT, не более того
Для десяти лет получается довольно скромный список. А сколько говнофич было добавлено? Сколько пизданутых опций появилось в блядском php.ini?
по дефолту строковые функции стали использовать utf-8
E_STRICT
Не отключается это теперь.
Но при этом mb_*-говно как было так и осталось.
>Не отключается это теперь
/facepalm. E_STRICT у них не отключается. Вообще охуеть.
Не стоит забывать это то, что я вспомнил за пару минут пока писал. Если посмотреть изменения от 5.1 до 5.5. убрано достаточно много.
Ага. Перечисли, пожалуйста, какие костыли и грабли были удалены из PHP за последние 10 лет.
В общем-то в крестах та же трабла - ради совместимости всё-всё-всё остаётся на месте. Только новые фишки добавляются.
про вариадик ты конечно забыл sizeof... легко выдает число параметров
Пример кода можно? На c++98 само собой.
sizeof... же вместе с вариадик шаблонами появился.
Ну и вариадик с sizeof... будет ПОД КАЖДЫЙ ВЫЗОВ КОМПИЛИТЬ НОВУЮ ФУНКЦИЮ. А initializer_list - нет.
ну ты и быдло. только оно считает число скомпилированных функций. и причем тут срр98? на дворе уже 2015 на тот случай если ты еще не заешь
быдлятно сильно
в классе МАССИВЫ вызывается член КАК СПИСОК для преобразования из ПАРАМЕТРОВ в СПИСОК
ну а в общем кроме названного борми: например создатели буста в своей уютной конфочке батхертели от std::make_unique, что создается 100500 шаблонов на каждую комбинацию аргументов
попутного ветра
Под ним крестовый стандарт, повиси-ка на нём,
А когда надоест, возвращайся назад
Писать на скриптах, писать на скриптах,
Писать на скриптах со мной.
Теперь жавабляди соснули? :)
Почему? Тип известен - std::vector<int>. Нормально компилится.
http://ideone.com/Ln8gMH
А если boost::any или boost::variant во втором параметре мапа поюзать - то и типы можно будет произвольные передать...
Что написал выше можно породить из const char*.
http://govnokod.ru/18153#comment285879
Но сама идея с uniform initializer мне вообще не нравится. Путаницы много создаёт.
Тогда вроде путаницы не должно было быть.
Тогда уж
Да, чтобы майндфака было побольше. Ну и { } чуть более строгие, чем (): Вот все допустимые варианты: http://en.cppreference.com/w/cpp/language/list_initialization
a{ } - новый инициализатор, [](){} и []{} - лямбды, >> - закрывашка от шаблона.
P.S. list comprehension тоже есть
https://msdn.microsoft.com/ru-ru/library/dd233214.aspx
http://en.cppreference.com/w/cpp/utility/integer_sequence
Просто литерал, нотацию из Ocaml позаимствовали.
Да не то чтобы прям много, зато однозначно всё, и можно всюду юзать одни и те же фигурные скобки, а не напрягать мозг каждый раз: какие же скобки тут удобнее и правильнее?
а зачем напрягать? их всего два вида для инициализации