Pull to refresh

Comments 38

Спасибо за работу и перевод современных книг, очень радует, что у нас этим занимаются.
Сама же книга, увы, допускает ряд неточностей, некачественных и неэффективных примеров.


Чего только стоит

Повсеместное использование

using namespace std;
Ну, для примеров в книге это простительно, код становится компактнее и читабельнее.
Сейчас примеры почистили, но до сих пор остались сомнительные моменты, о которых более подробно расписали в комментариях на реддите.

даже сам Бьярне в своих книгах для простоты использует


using namespace std;
Вообще, очень сладенькие нововведения, хотя мне потребуется время, чтобы глаз перестал видеть ошибки в новом синтаксисе там, где их нет. И начал видеть так, где они есть.
Например, я до сих пор в шоке, что вместо emplace_back(make_pair(10,«a»)); можно написать emplace_back(10,«a»);
Код гораздо чище становится, конечно, но надо перепривыкать… И как бы всё это в итоге не вытекло в отладочный Адъ.
Это же std::forward в конструктор пары, еще с 11 стандарта так можно писать.

шаблоны с переменным числом аргументов c++ погуглите ну и std::forward, всё логично

Счастливые вы люди… Я лишь недавно смог перейти на 2008 студию.(

Разрабатываете под винду? Сочувствую

Хуже! Под винду в 2008 студии. Сочувствие в квадрате.
Почему типам variant, optional, any уделяется столько внемания? Все кто хотел их уже давно используют из буста.
Тем, что теперь не надо будет тянуть буст.
книгу скачал, спасибо, на праздниках почитаю.
Активное использование auto, вот главная проблема. Особенно больно видеть в объявлении функции. Элементарный пример: функция возвращает кортеж каких-то типов, используется привязка, все переменные объявлены как auto, что есть что непонятно, смотрим объявление функции, опять auto!!! Придется смотреть тело функции что бы понять, а что же на самом деле возвращает эта функция. Это мрак.
Можно не писать везде auto, но там где возвращаются ацкие шаблонные шаблоны то выглядит не плохо.
В случае со связыванием без авто не обойтись, например тут:
auto [name, age] = get();
std::cout << name << " is " << age << std::endl;

Плюсую. По мне tuple — первый признак текущей архитектуры, если код к ним спускается — то это а) калька с функциональных языков или матлаба, а потому сугубо математический код, где структурирование до одного места или б) разработчик — жесткий лентяй, которому лень описать три строчки осмысленной структуры.


Все эти std::get сами по себе костыль, ни слова не говорящие о содержимом кортежа.

Filesystem Technical Spec же забыли!

ИМХО гораздо более приятно видеть простые утилитарные нововведения (пресловутый filesystem API или давно ожидаемые модули) чем синтаксические новинки (constexpr lambda итд), которые применимы только если вся команда гарантированно хорошо разбирается в этом.
Согласен, меня тоже больше интересует расширение стандартной библиотеки, нежели новые трюки.
constexpr lambda не синтаксическая новинка, а просто исправление предыдущих стандартов с целью консистентности подхода (потому что незвозможнсть лямбды быть constexpr нелогична). Это как раз очень полезно, так как на уровне библиотек не эмулируется, чего не скажешь о filesystem. Все его всю жизнь из boost использовали и не страдали от этого
Наконец, отмечу, что извлекать таким образом члены можно лишь из тех классов, в которых нужные вам данные являются общедоступными и нестатическими. Подробнее этот вопрос рассмотрен в следующей статье о структурированных привязках.

Достаточно инстанцировать для структуры/класса
std::get
std::tuple_element
std::tuple_size
и можно


auto [n, a, [c1, c2]] = p2; 

писать

auto& [n, a, Loc] = p2; 
auto& [c1, c2] = Loc;

так можно для любой структуры вида:


struct Location {
    std::string city;
    std::string country;
};

struct Person {
    std::string name;
    uint32_t age;
    Location loc;
};
Объем опечаток, явных ошибок и отсутствие части материала соответствует станадрту «Packt>»?

Есть 4 книги в одной не хватает пары страниц, в других ошибки с опечатками исчислюются очень большими числами, как-то боязно пользоваться книгами данного издательства.

вот тоже последнее время решил брать оригиналы на английском

Слегка подзадержался с ответом, но я и имел ввиду оригиналы на английском, уж очень они сырые.
  1. s/необходимость в std::get отпадает/необходимость в std::tie отпадает/
  2. "Зачем использовать std::variant" — вовсе не потому, что union чем-то плох (он решает свои задачи), а потому, что рано или поздно оказывается нужен именно variant — с явным хранением информации о типе. И каждый пишет свой велосипед. Лучше бы пример нормальный к нему привели — не try-catch, а хоть тот же visitor. И сказали бы, проконтроллирует ли компилятор обработку всех вариантов. И насколько хорошо он оптимизируется.
  3. Про std::optional — тот же вопрос про оптимизацию. Например, если мы заменяем nullable pointer на std::optional — будет ли оверхед строго нулевым (с выигрышем по надёжности и простоте кода за счёт value_or и т.п.)

Конечно, ответ на все эти вопросы нетрудно найти и самому, но необходимости прямо сейчас — нету (лично мне не перейти так вдруг на 2017)


Ну и банальное: variant/optional/any давно были в boost, кто хотел — тот пользовался. Так что тут скорее уместен вопль 'ура-ура, они есть у нас 'из коробки"'.

boost::variant может алоцировать память в куче, std::variant не аллоцирует память в куче никогда, так что это не тупо копия, а меньший оверхед

std::optional и std::any тоже имеют меньший оверхэд, не принижайте людей из комитета стандартизации, там не дураки сидят

Отлично (хотя и странно, в boost тоже умные люди пишут — но, возможно, какие-то оптимизации были недоступны).
Раз уж вы не поленились разобраться, то скажите: std::optional уже оптимизирован до предела? Т.е. можно всюду, где мы возвращали (возможно нулевой) указатель, возвращать optional и не проиграть ни в памяти, ни в быстродействии? Или пока нет?

Человек, который boost::variant писал(Антон Полухин, в Москве(иногда и в Сибири) его можно найти на C++ User Group Meetup), признаётся, что std::variant имеет меньший оверхэд


boost всегда реализуют без учёта "математики компиляторов".
В Core WG и в Library WG комитета стандартизации С++ все правки рассматривают с точки зрения всех популярных компиляторов, воспринимая компиляторы как математические объекты, всё что в std:: добавляется из boost:: всегда будет, благодаря Core WG и Library WG, иметь меньший оверхэд.

std::optional надо будет раскурить подробнее, пока точно не могу сказать
Антон, думаю тоже может лучше меня объяснить, в любом случае

std::tie всё также нужен для лексиграфического сравнения


std::tie(a,b) < std::tie(rhs.a, rhs.b);
std::tie нужен не только для распаковки tuple. Кортеж ссылок — нередкий кейс.

Насчёт tie — я всего лишь поправлял описку в статье.

std::tie всё также нужен для лексиграфического сравнения


std::tie(a,b) < std::tie(rhs.a, rhs.b);
Как скоро поддержка нового c++ будет на codeforces и подобных сайтах?
А почему именно с++1z, а не с++17 (и есть ли различия между 1z и 17?)
Sign up to leave a comment.