История изменений
Исправление eao197, (текущая версия) :
Старое все из языка что-ли убирают? почему проще?
Старое не сильно убирают, ибо совместимость.
Добавляют новые фичи, которые упрощают то, что раньше делать было либо муторно, либо вообще непонятно как.
Ну вот на пальцах. В C++98 со стандартными алгоритмами рекомендовалось использовать functor-ы. Допустим, нужно было найти первый элемент последовательности, который попадает в диапазон [l..r]. В старом C++ это можно было записать как-то так:
class in_range : public std::unary_function<int, bool> {
int l_;
int r_;
public:
in_range(int l, int r) : l_(l), r_(l) {}
bool operator()(int v) const { return l_ <= v && v <= r_; }
};
...
my_sequence::iterator it = std::find_if(seq.begin(), seq.end(), in_range(10, 120));
auto it = std::find_if(seq.begin(), seq.end(), [](int v) { return 10 <= v && v <= 120; });
auto it = std::find_if(seq.begin(), seq.end(), [](auto v) { return 10 <= v && v <= 120; });
В C++11 сделали variadic templates. То, чего раньше не было, и что в том же Boost-е костылили через простыни макросов. В C++17 работу с variadic templates упростили за счет if constexpr.
В C++11 сделали возможным выводить тип результата функции, что было очень важно в шаблонах. Например:
template<typename T, typename U> ? add(T a, U b) { return a+b; }
template<typename T, typename U> auto add(T a, U b) -> decltype(a+b) {
return a+b;
}
template<typename T, typename U> auto add(T a, U b) {
return a+b;
}
В общем, с 2003-го года в C++ вошло столько мелких и не очень изменений, что теперь это в прямом смысле другой язык. Особенно сильно это ощущаешь, когда приходится в C++98 погрузиться и подправить что-то в древнем коде.
Исходная версия eao197, :
Старое все из языка что-ли убирают? почему проще?
Старое не сильно убирают, ибо совместимость.
Добавляют новые фичи, которые упрощают то, что раньше делать было либо муторно, либо вообще непонятно как.
Ну вот на пальцах. В C++98 со стандартными алгоритмами рекомендовалось использовать functor-ы. Допустим, нужно было найти первый элемент последовательности, который попадает в диапазон [l..r]. В старом C++ это можно было записать как-то так:
class in_range : public std::unary_function<int, bool> {
int l_;
int r_;
public:
in_range(int l, int r) : l_(l), r_(l) {}
bool operator()(int v) const { return l_ <= v && v <= r_; }
};
...
my_sequence::iterator it = std::find_if(seq.begin(), seq.end(), in_range(10, 120));
auto it = std::find_if(seq.begin(), seq.end(), [](int v) { return 10 <= v && v <= 120; });
auto it = std::find_if(seq.begin(), seq.end(), [](auto v) { return 10 <= v && v <= 120; });
В C++11 сделали variadic templates. То, чего раньше не было, и что в том же Boost-е костылили через простыни макросов. В C++17 работу с variadic templates упростили за счет if constexpr.
В C++11 сделали возможным выводить тип результата функции, что было очень важно в шаблонах. Например:
template<typename T, typename U> ? add(T a, U b) { return a+b; }
template<typename T, typename U> auto add(T a, U b) -> decltype(a+b) {
return a+b;
}
template<typename T, typename U> auto add(T a, U b) {
return a+b;
}
В общем, с 2003-го года в C++ вошло столько мелких и не очень изменений, что теперь это в прямом смысле другой язык. Особенно сильно это ощущаешь, когда приходится в C++98 погрузиться и подправить что-то в древнем коде.