LINUX.ORG.RU

История изменений

Исправление 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));
В С++11 добавили лямбды и вывод типов, поэтому тоже самое теперь можно записать как:
auto it = std::find_if(seq.begin(), seq.end(), [](int v) { return 10 <= v && v <= 120; });
В C++14 пошли еще дальше, теперь можно делать лямбды полиморфные, т.е. не нужно выписывать типы аргументов явно, они выводятся:
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; }
Тут в C++98 непонятно было, что писать вместо вопросика. Особенно, если T и U — это не банальные int и short, а какие-то пользовательские типы. В C++11 стало можно писать:
template<typename T, typename U> auto add(T a, U b) -> decltype(a+b) {
  return a+b;
}
А в C++14 сделали еще проще:
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));
В С++11 добавили лямбды вывод типов, поэтому тоже самое теперь можно записать как:
auto it = std::find_if(seq.begin(), seq.end(), [](int v) { return 10 <= v && v <= 120; });
В C++14 пошли еще дальше, теперь можно делать лямбды полиморфные, т.е. не нужно выписывать типы аргументов явно, они выводятся:
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; }
Тут в C++98 непонятно было, что писать вместо вопросика. Особенно, если T и U — это не банальные int и short, а какие-то пользовательские типы. В C++11 стало можно писать:
template<typename T, typename U> auto add(T a, U b) -> decltype(a+b) {
  return a+b;
}
А в C++14 сделали еще проще:
template<typename T, typename U> auto add(T a, U b) {
  return a+b;
}

В общем, с 2003-го года в C++ вошло столько мелких и не очень изменений, что теперь это в прямом смысле другой язык. Особенно сильно это ощущаешь, когда приходится в C++98 погрузиться и подправить что-то в древнем коде.