зима. сезон дождей в СФ.

я прилетел в СФ на 14 февраля, в далеком теперь уже 2008 году.
по несколько раз на дню город преображался, и я бродил по нему в немом восторге, вдыхая тончайшее кружево разноцветного тумана над Президио и Мариной, где Лукасфильм.

впервые в жизни я увидел как призрачным вихрем горят в тумане отражающиеся от небоскребов солнечные лучи, и я влюбился в этот город так, как только может влюбиться 32-летний мужчина с сердцем мальчишки.

и вот теперь, почти 9 лет спустя, я еду в автобусе, и до меня медленно доходит,
что в С++17 приняли не то предложение о порядке вычисления выражений
которое делало всё нормально, p0431 авторства уважаемого Hyman Rosen,
а то, где всё набекрень, и невозможно запомнить что в каких случаях где, p0145 авторства достопочтенного Херба “f(new T, new T)” Саттера, Габриэля дос Рейса и Джонатана Кейва.

я был весь в предвкушении вкусовых микровзрывов шоколадных бомбочек от Christopher Elbow, и оттуда – в Davies Symphony Hall, на титанического Ефима “ланг ланг свободен” Бронфмана с Четвёртым Бетховена, и, – самое волшебное, – на девяностолетнего Бломстедта с Третьей Брамса и внезапно полным богатым европейским звуком оркестра, словно наши уважаемые музыканты в SF Symphony вдруг вспомнили свои ещё такие недавние корни от лёгкого движения бровей маэстро.

и тут - бам! - понимаю, что пропоузал приняли таки не тот!

@Zeux: Я правильно понимаю, что вместо того чтобы зафиксировать left-to-right eval order везде, они чего-то там захачили про операторы и все?

@aruslan: они сделали 2@=1 и ещё всякого, но не до конца и довольно неряшливо.
и ладно бы никто не догадывался, но p0431 как раз начинается с мотивирующего примера:

  int &a(); int &b();
  int main() {
    a() << b();
    a() += b();
    a() == b();
  }

где раньше всё было просто unspecified, а после p0145 в первом случае – a() вычисляется до b(), во втором – после, а в третьем – как раньше.
вся надежда на обсуждение и последующие встречи комитета, но есть высокий риск что они нам отравят всё будущее.
сейчас в этой области чистая поляна, порядок либо не определён либо UB, самое время для ясных простых правил и пусть оно дальше все само цветет.

@Zeux: эх.
ну хоть в map можно будет писать.
но конечно мда.

@aruslan: т.е. я понятно за себя не беспокоюсь, но одно дело с умным видом говорить что “по слухам на Unisys…”, “а когда в слове 36 бит”, или причмокивать губами о “тегированных архитектурах” или хотя бы “а вот на PowerPC”, и совсем другое – “там трое чуваков наскипидарились чёрным и воткнули эти правила, и теперь значит запоминаем порядок вычисления a и b в a.operator=(b) и a = b”.

@StiX: Дык в С++, начиная с 11-й версии стандарта какой-то отрицательный отбор пошел
@Alexey Frunze: Годами выве(т)ренные плюсы сменяются как в рекламе шампуней.
Выкинь старый, купи новый с живительным жожоба!

@aruslan: можно по-разному к этому относиться, но вот это одно конкретное изменение по-настоящему могло убрать полностью “коварные” дебильные вопросы на интервью и вполне реальные очень subtle две-недели-в-отладчике баги.
могло бы.
но вместо этого херб с габриэлем и джонатаном решили наскипидариться.

меня еще жёстко вспенивает от этой растянувшейся на декаду эпопеи с decltype(auto) x = a vs decltype(auto) x = (a)
но это хоть как-то объяснимо. наверное.
типа сначала был &C::m vs &(C::m), или как там:

когда они пришли со скобками вокруг id-выражений, я молчал: такие скобки я редко пишу, и оно “герметично”:

struct C { int m; };
static_assert(std::is_same_v<
    decltype(&C::m),
    int C::*>);
static_assert(std::is_same_v<
    decltype(&(C::m)),
    int*>);                 // gcc FTW!

(см на ideone)

когда они пришли с auto и decltype, я молчал и нервно напоминал себе, что они решали разные задачи, и поэтому неуловимо но полностью отличались в мелких важных деталях:

int&& f();
auto x1 = f();              // int
decltype(f()) x2 = f();     // int&&

когда они пришли со скобками в decltype, я молчал и испуганно успокаивал себя, что это только внутри decltype:

int i;
decltype(i) x3;             // int
decltype((i)) x4 = i;       // int&

и когда они пришли с decltype(auto) за произвольными выражениями, уже некому было заступиться за меня:

decltype(auto) x5 = i;      // int
decltype(auto) x6 = (i);    // int&
decltype(auto) f() {
  int a = ..., b = ...;
  return (a == b ? a : b);  // int&
}

@Timur Bukharaev: это в C++ больше всего раздражает
сначала понапридумывают всякого
а потом долго изучают особенности брожения
задают хитрые вопросы на интервью
и гордятся этими тонкими знаниями
даже кликухи себе придумывают типа ВасяC++ или ПетяCppGuru
мне кажется ни в одном другом языке больше нет такого эпикурейства

@sim0nsays: ВасяС++ это пять
@aruslan: Вася Си Плюс Плюс - мой кумир!
@Alexey Frunze: Ещё Алёнацпп есть. Не отставайте, мужуки!

@nobuddhy: карту торфяных болот можно знать, чтобы держаться от них подальше, или чтобы ходить на них в экспедицию по спасению тех, кто не знает, или ходить туда ради адреналина, ноуки и уточнения карты (на то оно и болото, чтобы булькать и терраморфироваться).
из разговоров о болоте обычно трудно понять, зачем человек его изучает.
когда таких вопросов на интервью много, у меня тревожная лампа мигает во всю силу.
если бы я вставлял в интервью что-то подобное, то хотел бы услышать
“я таких особенностей языка по доброй воле и без крайней необходимости не использую, но если нужно, то разберусь.
надеюсь, у вас такое случается один или менее раз в год, не так ли?”,
а апликанту потом ловить нотки нервозности и фальши в ответном хихиканьи
“конечно-конечно, именно так у нас и есть!”.
самурай конечно должен уметь убить и палочками для риса, но обычно использует катану,
а ситуация, когда из доступного оружия только анальный зонд –
она вообще-то для самурая оскорбительна сама по себе.

@aruslan: ты как-то прямо скажем сгустил.

@nobuddhy: воспринимаю это как комплимент!
Но на мифологическом уровне я все это категорически поддерживаю.
И миазмы, и шаманов, приходящих в религиозный экстаз от вдыхания оных. Прекрасно служит повышению ценности профессии!

@aruslan: у тебя безусловно более глубокий уровень зачерпывания.
даже возможно чрезмерно глубокий, раз и миазмы, и экстаз, и вот это всё.

я как-то всё больше предпочитаю скользить.
для меня самые интересные срезы С++
pointer provenance, std::launder, sequenced-before и, безусловно, тернарный оператор –
они как свеженасыпавшийся снежок на длиннющем склоне.

как пухляк.
и длинно-длинно нарезаешь не торопясь.
солнце искрит, дышишь полной грудью, и хочется сказать
– эх красота-то какая!
и подрезать чуть глубже, и скорость все выше,

пухляк превращается в powder,
вот позади нарастающий шум приключения,
первые языки лавины слизывают соратников,

входишь в вираж,
порох под ногами с пронзительным басовитым свистом вдруг начинает чертить дуги шутих,
резко уходишь в сторону, уворачиваясь от ошмёток medium rare тех кто шёл на повышенных уровнях оптимизации,
и становится чутка сцыкотно, и хочется вдруг взять и ехать по обычной трассе,
с нормальными подъемниками, среди таких обычных, таких родных людей, по жестковатому но уверенному и простому снегу,
даже видишь впереди что-то типа обычной трассы,

влетаешь туда снежной двухметровой волной в повороте,
и запоздало понимаешь, что – уфхцч! – не тот пропозал взяли в стандарт,
забираешь вверх по склону пока хватает скорости, но

снег чавкающим ковром тянет вниз,
а порядок вычислений казавшийся таким естественным – рвёт снежную ткань,
и вот уже под ногами камни, мелкие сосенки и
остовы горящих кораблей, и над головой на опережение пролетают
отяжелевшие крешдампы,

вдруг снег окрашивается кроваво-чёрным, всё становится кристально прозрачным – как во сне, когда всё одновременно чётко и в фокусе, и ты хладнокровно разрываешь точки сборки отладчика, и находишь, находишь ту совершенно невинную лишнюю пару скобок которую поставил твой соратник, и ты хватаешь их, и

(оригинал на кружках)