Я тут почитал про все эти xvalue, glvalue и прочие lpszvalue в новом С++. Я даже не знаю, что сказать. Вроде все логично, но очень уж сильно начинает напоминвть PL/1. По слухам, это был один из самых развесистых языков, который почти никто не знал до конца.
Да. Когда приходится возвращаться к С++ после более "человеческих" языков, часто возникает вопрос: ну зачем все эти сложности? Вопрос чисто риторический, конечно.
?: в качестве lvalue - скорее забавный семантический момент, чем странности С++. Когда написано (a ? b : c) = d; это выглядит несколько странно, но понятно, что происходит. Настолько понятно, что возникает вопрос: а почему в других языках так нельзя? Странности С++ начинаются, когда b и c разных типов (хоть и совместимых по присваиванию). Тут вся конструкция перестаёт компилироваться и у бедного программиста наступает лёгкий WTF...
Comments 6
Reply
Reply
Reply
Потому что в других языках нет понятия указателя или, чур меня, ссылки. Там присваивать можно только переменным или их свойствам/полям.
В тех языках, где есть указатели (С, Паскаль), вполне можно написать что-то подобное:
*(f()?g():h()) = 42;
^(SomeFunctionCall(1,2,3)) := 42; /* too bad Pascal does not have a ternary operator */
PS. В других языках зато можно вот так:
/* JavaScript */
var x = {};
var y = {};
var z = 42;
(z > 40?x:y).field = 99;
Reply
Leave a comment