Сообщения

Сообщения за ноябрь, 2018

Полезные новации С++17. Выражения свертки (Fold expressions)

Начиная с C++11, в языке появились пакеты параметров для шаблонов с переменным количеством аргументов. Такие пакеты позволяют реализовывать функции, принимающие переменное количество параметров. Иногда эти параметры объединяются в одно выражение, чтобы на его основе можно было получить результат работы функции. Решение этой задачи значительно упростилось с выходом C++17, где появились выражения свертки. Реализуем функцию, которая принимает переменное количество параметров арифметических типов и возвращает их сумму. template <typename ... Ts> auto sum(Ts ... ts) {    return (ts + ...); }     Следует обратить внимание на обязательность скобок в выражении  (ts + ...).  Функцию можно использовать так: int the_sum {sum(1, 2, 3, 4, 0.5)}; // Значение: 10.5    Общий смысл понятен. Поработаем над деталями. Первое наше упущение - отсутствие возможности работать с пустым списком параметров. Инстанцирование  sum() приводит к ошибке ...

Ключевые слова auto и decltype – сходства, отличия и нюансы использования. Часть 4. Новое в С++14/17 по auto и decltype.

Добавлено в С++14 Вывод возвращаемого типа функций — означает, что вы можете использовать ключевое слово auto там, где обычно размещается возвращаемый тип функции. Вы можете теперь написать: auto add(int a, int b) {      return a + b; } вместо int add(int a, int b) {       return a + b; } Изменение правила вывода типа при объявлении переменной . Как мы уже поняли, пути по которым auto и decltype выводят тип выражения существенно отличаются. В С++14 мы имеем возможность использовать правила вывода decltype при инициализации переменной. int& foo(); decltype(auto) i = foo(); // i типа int& Если бы мы использовали здесь auto – мы получили бы int вместо int&: int& foo(); auto i = f(); // i типа int Разумеется, мы могли бы также получить int&, добавив ключевое слово auto со ссылкой: int& foo(); auto& i = f(); // i типа int&  Вывод типа аргументов лямбда означ...

Ключевые слова auto и decltype – сходства, отличия и нюансы использования. Часть 3. decltype вывод типа сложного выражения.

В продолжение предыдущего .  2 ситуация. К ней относятся все выражения, не попадающие в 1 ситуацию, то есть все выражения, НЕ являющиеся простой, непараметризированной переменной, параметром функции или доступом к члену класса. Для упрощения терминологии, давайте назовем выражения, подпадающие под ситуацию 2 — сложными выражениями , и наоборот, подпадающие под 1 ситуацию — простыми выражениями . Простейший путь произвести сложное выражение — это взять простое и заключить его в скобки, вот так (х). Так что же делает decltype со сложными выражениями? Для точной формулировки правила необходимо разобраться сначала с терминами lvalue , xvalue и prvalue . Термины xvalue и prvalue определяют разбиение множества rvalue на два подмножества. Поэтому сначала разбиремся с lvalue и rvalue . Первоначальное определение lvalue и rvalue из младенческих дней языка С может быть сформулировано так: Lvalue есть выражение, которое может находится в левой или правой стороне присваива...