четырнадцатое февраля
зима. сезон дождей в СФ.
я прилетел в СФ на 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!
когда они пришли с 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 тех кто шёл на повышенных уровнях оптимизации,
и становится чутка сцыкотно, и хочется вдруг взять и ехать по обычной трассе,
с нормальными подъемниками, среди таких обычных, таких родных людей, по жестковатому но уверенному и простому снегу,
даже видишь впереди что-то типа обычной трассы,
влетаешь туда снежной двухметровой волной в повороте,
и запоздало понимаешь, что – уфхцч! – не тот пропозал взяли в стандарт,
забираешь вверх по склону пока хватает скорости, но
снег чавкающим ковром тянет вниз,
а порядок вычислений казавшийся таким естественным – рвёт снежную ткань,
и вот уже под ногами камни, мелкие сосенки и
остовы горящих кораблей, и над головой на опережение пролетают
отяжелевшие крешдампы,
вдруг снег окрашивается кроваво-чёрным, всё становится кристально прозрачным – как во сне, когда всё одновременно чётко и в фокусе, и ты хладнокровно разрываешь точки сборки отладчика, и находишь, находишь ту совершенно невинную лишнюю пару скобок которую поставил твой соратник, и ты хватаешь их, и