Здравствуйте, Pzz, Вы писали:
Pzz>Пятый раз повторяю, что это не сработает, потому что нет способа запретить "лишним" конструкциям попадать в проект.
В принципе, есть. Начиная от code-review, заканчивая использованием специализированных автоматических инструментов (вроде как PVS-Studio может проверять код на соответствие MISRA C и MISRA C++).
Pzz>Их там технически нет, видимость одна. То, как в C++ устроено управление памятью, не позволяет в общем случае при замыкании прихватить любую переменную из локальной области видимости.
Тем не менее, они есть (в отличии от C) и позволяют делать разные полезные штуки, вроде Go-шных defer или D-шных at_scope_exit.
И это мы еще не рассматривали такие мощные инструменты для создания абстракций, как классы и шаблоны. Например, как вы в чистом C выразите абстракцию "значение в заданном диапазоне", которая на C++ делается влет простым шаблоном вроде:
template<class T, T Left, T right>
class constrained_value {
T v_;
public:
explicit constrained_value(T v) : v_(v) {
if( !(v_ >= Left && v_ <= Right) )
throw ...; // Или вызов abort.
}
operator T() const { return v_; }
};
using my_range = constrained_value<short, -500, 500>;
my_range get_current_value() {...}
Причем для написания такой примитивной версии не нужно больших познаний в языке. Они потребуются если захочется сделать constrained_value более универсальным и способным работать с разными типами, в том числе и не такими тривиальными, как short или long.