В 2011 году был принят новый стандарт языка С++. Он позволяет программистам сократить написание кода за счет новых возможностей языка.
Автоматическое определение типа переменной:
Возможность определять тип данных в другом типе данных приводит к написанию длинных строчек кода, как это показано в примере ниже:
template<classType>classadapter{ Type _object;public:typedef Type* pointer_type;adapter(Typep):_object(p){}pointer_typepointer(){return&_object;}// ...};adapter<int>a(5);adapter<int>::pointer_type p =a.pointer();
Цепочка, указанная в последней строчке может быть очень длинной, и её запись затрудняет как написание кода, так и его читаемость. Поэтому, в новом стандарте было предложено компилятору определять автоматически тип переменной (при указании ключевого слова auto), по его значению:
auto val =5;adapter<int>a(val);auto p =a.pointer();
В указанном примере компилятор автоматически определит, что у переменной val тип int, у переменной p – тип adapter<int>::pointer_type.
Списки инициализации:
Идея списков инициализации пришла из С, где объекты структуры могут быть проинициализированы перечислением значений. В С++11 таким образом можно теперь инициализировать объекты классов, при помощи шаблонного класса std::initializer_list. Реализуется этот механизм следующим образом.
Нулевой указатель:
Использование в качестве нулевого указателя значения 0 в некоторых случаях приводило к опасному коду. В приведенном ниже примере :
``
Компилятор вызовет функцию с целочисленным параметром, хотя может предполагаться использование второй функции. Для решения этой проблемы предлагается использовать ключевое слово nullptr в качестве нулевого указателя. Инициализация указателя нулем будет выглядеть как void* ptr = nullptr;
Циклы по коллекциям:
Во многих языках программирования существуют специальные циклы foreach, которые позволяют перебирать элементы коллекции, не используя доступа через индекс (или итератор). В новом стандарте С++ предлагается новая форма записи цикла for: for( type element: collection){} . Эта запись означает - "для каждого элемента element из коллекции collection повторять ...". Пример использования данного цикла:
Лямбда-функции (лямбда-выражения):
Лямбда-выражения позволяют программистам ускорить написание кода. Под лямбда-выражениями понимают специальный способ записи функторов. Например, функтор sum и лямбда-функции в следующем примере эквивалентны по использованию и поведению:
Использование лямбда-функций очень разнообразно и заслуживает отдельной темы.
// то же, что и [](int x, int y) -> int{ int result = x + y; return result; }
auto lambda = [](int x, int y) { return x + y; }
struct sum{
int opertator()(int x, int y){ return x+y;}
};