Растение заинтересовано в том, чтобы его семена были распространены по как можно большей территории, а посему его плоды должны быть максимально привлекательны для потенциальных курьеров.
Растение ни в чем не «заинтересовано».
Те, чьи плоды не были максимально привлекательны для потенциальных курьеров, просто вымерли, вот и все.
Тезис уже достаточно подробно раскрыт в других комментариях, но ок.
Проблема простых enum'ов в отсутствии скопа и неявных преобразованиях, позволяющих смешивать разные enum'ы.
Комитет в своей бесконечной мудрости ловко решил обе проблемы одним выстрелом, добавив enum class.
Однако, это две сильно разные проблемы: отсутствие скопа — это (почти) всегда плохо, а вот неявное преобразование — плохо не всегда, однако его оторвали совсем и нельзя даже opt-in.
Традиционно enum используется для определения констант, как окультуренный аналог #define. Скоп здесь весьма уместен, дабы не пихать префиксы прямо в имена констант, и с легкостью внедряется банальным поиском и заменой. А вот с отстуствием неявного приведения типов все гораздо хуже: чтобы не писать static_cast на каждый чих, тип этого enum class надо протаскивать везде, где он используется, что в любом проекте сложнее helloworld порождает вопросы «а стоит ли оно того?». Проще обычный enum в struct или namespace положить.
Кроме того, enum используется еще и для определения флагов, а флаги не живут в ваккууме, их надо уметь комбинировать и разделять, поэтому надо не только протаскивать везде новый тип, но и перегружать операции над ним, что кажется легким только на первый взгляд.
Для понимания проблемы попробуйте переделать вот этот достаточно простой и идиоматичный код на enum class, желательно, не меняя слишком много (в реальном проекте миллион строк) и сохраняя идиоматичность (с кодом работает более одного человека):
enum flags
{
flag1 = 0x1,
flag2 = 0x2,
flag3 = 0x4,
};
int main()
{
auto state = 0;
if (some_condition)
state = get_some_external_state();
cout << "state is " << hex << state;
if (state & flags::flag1)
{
// something
}
if (state & flags::flag2)
{
// something else
}
set_some_external_state(state | flags::flag3);
}
А как вам субтитры помогут понимать акценты и шутки?
С этим вообще все достаточно сложно, т.к. половина шуток — это ссылки на поп-культуру, причем даже не в настоящем, а в прошлом для персонажей и аудитории, т.е. то, с чем они выросли и чего вы извне не знаете по определению.
Однако, ситуация не безнадежна: если за кадром ржут, а вы не понимаете, почему — это все прекрасно гуглится, было бы желание.
Можно перегрузить &, |, &&, ||, ^, &=, |=у этого enum'а и работать с ними как раньше
Можно, но «как раньше» не будет.
Если вы, например, перегружаете & для некоторого enum class, моделирующего битовые флаги, то из оператора вы, вероятно, тоже возвращаете этот же тип, а не какой-то голый int, иначе ради чего это все. Однако, enum class неявно не конвертится ни в bool, ни в int и добавить к нему это нельзя, поэтому вместо
if (Value & my_flags::foo)
придется городить
if ((Value & my_flags::foo) != my_flags::zero_flag)
или вообще
if (flags::is_set(Value, my_flags::foo))
что, конечно, реализуемо и даже безопаснее, чем раньше, но выглядит неидиоматично и набирать эти простыни никакой радости.
enum class — это «хотели как лучше, а получилось как всегда».
Статья есть лишь краткое перечисление пунктов, а не огромный талмуд описывающий подробно все возможные случаи и границы применения.
Вы пишете "Как различить C и C++-разработчиков" и приводите безапелляционный список "делай так, а не так". А потом дети и сишники начитаются и начнут лепить explicit и virtual куда ни попадя, потому что "это С++, так в интернете написано".
Много шума из ничего.
Этот hot reload, который по сути rebranded edit & continue, никогда толком не работал и по прежнему толком не работает даже в VS2022.
Компания сделала это ради вставки Hot Reload только в коммерческую версию нового редактора Visual Studio 2022 и получения преимущества над открытой версией Visual Studio Code.
Что, простите? О каком преимуществе речь? VS Code — это огрызок со цветовой схемой VS, которому до настоящей VS как до луны, наличие или отсутствие hot reload тут не меняет ничего.
Действительно, полыхает, но от того, что половина списка — карго-культ:
Используете простые указатели на функции вместо std::function;
Это очень разные инструменты для очень разных случаев. Советовать слепо применять аллоцирующий полиморфный враппер независимо от того, нужен ли он — это шикарно само по себе, даже если забыть о том, что половина случаев с указателями на функции — это интероп с C и std::function туда не пролезет при всем желании.
Используете простые enum вместо enum class;
Если у вас enum'ами задаются конкретные константы, которые часто надо куда-то передавать в числовом виде (тот же интероп), то от enum class больше попаболи, чем пользы.
Для функций, не кидающих исключения, не используете noexcept.
А вы можете доказать, что не кидающих? И что все, используемое в этих функциях, тоже некидающее? И используемое используемым all the way down? noexcept уместен в специальных функциях и критических местах, в остальных — опять же, больше попаболи, чем пользы.
Для конструкторов забываете explicit.
Для всех подряд?
Для деструкторов забываете virtual
Для всех подряд?
Если вам нужно вернуть из функции несколько разных значений (например, результат работы и/или код ошибки)
+ 21. Если вы используете коды ошибок вместо исключений.
Нет звука [r]. Гонконгский английский не ротический. Звук [r] там редуцируется практически везде. К примеру, слово hard вместо [hɑːrd] будет произноситься как [hɑːd].
Вы так говорите, как будто r в английском и так не редуцируется практически везде.
Я же говорю — статья найдется. Аль Капоне посадили не за убийства, рэкет и сутенерство, а всего лишь за неуплату налогов.
Если это маньяк, как в статье, и законных улик нет, то, как тут в соседней теме объясняли, у полиции может совершенно случайно оказаться достаточно оснований для no-knock warrant, а дальше подозреваемый окажет сопротивление задержанию или просто резко рукой махнет и сотрудникам придется открыть огонь.
Спецслужбы же при обмазывании дверных ручек вообще никакими законными основаниями не заморачиваются. Как и криминал.
"Открытый исходный код" в разделе "Особенности"...
Это должно быть обязательным требованием для менеджера паролей, а не "особенностью".
Запусти непонятно что, загрузи в него свои пароли от всего, залей дяде в облако и еще плати за это каждый месяц.
Полиция сама будет шарахаться от таких служб, чтобы не запороть следствие.
Даже если подобные улики невозможно будет законно прикрепить к делу и использовать в суде, они помогут на порядки сузить круг подозреваемых и в конце концов выйти на конкретного человека.
А если человек есть, то и статья, как известно, найдётся.
Они там уже хранятся, в дебажных символах и таблицах экспорта
Дебажные символы как бы в дебажных билдах. Можно, конечно, и в релизе включить, но видеть вместо условно трех мегабайт тридцать радости мало. Если std::stacktrace будет использовать внешние pdb — ок, но если ради трейса надо будет таскать внутри кода полный комплект символов, то это ой, проще выключить и пользоваться дальше всяким platform specific. А из таблиц экспорта вообще много не вытащишь.
Не интересно, совсем. Если в коде есть
то это баг, независимо от того, что там за malloc и что там за условия.
Те, чьи плоды не были максимально привлекательны для потенциальных курьеров, просто вымерли, вот и все.
Тут 19 лет только изучаешь и применяешь, а до «совершенства» как до луны.
Проблема простых enum'ов в отсутствии скопа и неявных преобразованиях, позволяющих смешивать разные enum'ы.
Комитет в своей бесконечной мудрости ловко решил обе проблемы одним выстрелом, добавив enum class.
Однако, это две сильно разные проблемы: отсутствие скопа — это (почти) всегда плохо, а вот неявное преобразование — плохо не всегда, однако его оторвали совсем и нельзя даже opt-in.
Традиционно enum используется для определения констант, как окультуренный аналог #define. Скоп здесь весьма уместен, дабы не пихать префиксы прямо в имена констант, и с легкостью внедряется банальным поиском и заменой. А вот с отстуствием неявного приведения типов все гораздо хуже: чтобы не писать static_cast на каждый чих, тип этого enum class надо протаскивать везде, где он используется, что в любом проекте сложнее helloworld порождает вопросы «а стоит ли оно того?». Проще обычный enum в struct или namespace положить.
Кроме того, enum используется еще и для определения флагов, а флаги не живут в ваккууме, их надо уметь комбинировать и разделять, поэтому надо не только протаскивать везде новый тип, но и перегружать операции над ним, что кажется легким только на первый взгляд.
Для понимания проблемы попробуйте переделать вот этот достаточно простой и идиоматичный код на enum class, желательно, не меняя слишком много (в реальном проекте миллион строк) и сохраняя идиоматичность (с кодом работает более одного человека):
С этим вообще все достаточно сложно, т.к. половина шуток — это ссылки на поп-культуру, причем даже не в настоящем, а в прошлом для персонажей и аудитории, т.е. то, с чем они выросли и чего вы извне не знаете по определению.
Однако, ситуация не безнадежна: если за кадром ржут, а вы не понимаете, почему — это все прекрасно гуглится, было бы желание.
Если он там есть — естественно, std::function проще, лучше и понятнее, чем любой ручной колхоз.
Однако, оверхед там есть и он далеко не нулевой, даже с оптимизациями. И noexcept, как автор рекомендует в 12 пункте, уже не прицепишь.
Поэтому все как всегда — используйте что угодно, если вы понимаете, как оно работает и можете себе это позволить.
Можно, но «как раньше» не будет.
Если вы, например, перегружаете & для некоторого enum class, моделирующего битовые флаги, то из оператора вы, вероятно, тоже возвращаете этот же тип, а не какой-то голый int, иначе ради чего это все. Однако, enum class неявно не конвертится ни в bool, ни в int и добавить к нему это нельзя, поэтому вместо
придется городить
или вообще
что, конечно, реализуемо и даже безопаснее, чем раньше, но выглядит неидиоматично и набирать эти простыни никакой радости.
enum class — это «хотели как лучше, а получилось как всегда».
Вы пишете "Как различить C и C++-разработчиков" и приводите безапелляционный список "делай так, а не так". А потом дети и сишники начитаются и начнут лепить explicit и virtual куда ни попадя, потому что "это С++, так в интернете написано".
Много шума из ничего.
Этот hot reload, который по сути rebranded edit & continue, никогда толком не работал и по прежнему толком не работает даже в VS2022.
Что, простите? О каком преимуществе речь? VS Code — это огрызок со цветовой схемой VS, которому до настоящей VS как до луны, наличие или отсутствие hot reload тут не меняет ничего.
Действительно, полыхает, но от того, что половина списка — карго-культ:
Это очень разные инструменты для очень разных случаев. Советовать слепо применять аллоцирующий полиморфный враппер независимо от того, нужен ли он — это шикарно само по себе, даже если забыть о том, что половина случаев с указателями на функции — это интероп с C и std::function туда не пролезет при всем желании.
Если у вас enum'ами задаются конкретные константы, которые часто надо куда-то передавать в числовом виде (тот же интероп), то от enum class больше попаболи, чем пользы.
А вы можете доказать, что не кидающих? И что все, используемое в этих функциях, тоже некидающее? И используемое используемым all the way down? noexcept уместен в специальных функциях и критических местах, в остальных — опять же, больше попаболи, чем пользы.
Для всех подряд?
Для всех подряд?
+ 21. Если вы используете коды ошибок вместо исключений.
Noodles, strudel, burger, schnitzel, bratwurst, sauerkraut...
Вы так говорите, как будто r в английском и так не редуцируется практически везде.
Жаль, что без Vice City Stories и Liberty City Stories.
Я же говорю — статья найдется. Аль Капоне посадили не за убийства, рэкет и сутенерство, а всего лишь за неуплату налогов.
Если это маньяк, как в статье, и законных улик нет, то, как тут в соседней теме объясняли, у полиции может совершенно случайно оказаться достаточно оснований для no-knock warrant, а дальше подозреваемый окажет сопротивление задержанию или просто резко рукой махнет и сотрудникам придется открыть огонь.
Спецслужбы же при обмазывании дверных ручек вообще никакими законными основаниями не заморачиваются. Как и криминал.
"Открытый исходный код" в разделе "Особенности"...
Это должно быть обязательным требованием для менеджера паролей, а не "особенностью".
Запусти непонятно что, загрузи в него свои пароли от всего, залей дяде в облако и еще плати за это каждый месяц.
О дивный новый мир.
Это примечание уместно после каждого "улучшен" в любом анонсе от MS.
Не хочется уподобляться сторонникам теории заговора, но какое интересное совпадение с определенными событиями.
Даже если подобные улики невозможно будет законно прикрепить к делу и использовать в суде, они помогут на порядки сузить круг подозреваемых и в конце концов выйти на конкретного человека.
А если человек есть, то и статья, как известно, найдётся.
Дебажные символы как бы в дебажных билдах. Можно, конечно, и в релизе включить, но видеть вместо условно трех мегабайт тридцать радости мало. Если std::stacktrace будет использовать внешние pdb — ок, но если ради трейса надо будет таскать внутри кода полный комплект символов, то это ой, проще выключить и пользоваться дальше всяким platform specific. А из таблиц экспорта вообще много не вытащишь.