Comments 29
return [this] { print(); };
}
Круглых скобочек на хватает после [this]?
Хмммм… А компилятор сожрал.
Это какой-то новый синтаксис? С каких пор?
Да вроде даже в С++11 можно было не указывать пустые круглые скобки, если у лямбды параметров не было.
If a lambda-expression does not include a lambda-declarator, it is as if the lambda-declarator were ().
auto foo = []<typename T>(const auto& vec) {
std::cout<< std::size(vec) << '\n';
std::cout<< vec.capacity() << '\n';
};
Тут в примере ошибка как мне кажется <typename T\> вроде лишнее
Я вот думаю, что хоть и пишу на плюсах уже очень давно, и в целом люблю этот язык, никому бы не порекомендовал его учить в 2019.
Зависит от того, чем хочется заниматься. Думаю если бы я сейчас делал выбор, выбирал бы между Scala и C#, но выбрал бы скорее второе. Если бы я жил в счастливом будущем, где куча вакансий на Rust, я, бы выбрал Rust
Rust вполне себе альтернатива плюсам. А там где не альтернатива, скорее всего нужен Си, а не Си++. Си, в свою очередь, рекомендую выучить вообще всем, хотя бы на уровне "одну книжку прочитал".
Вообще, я и начал свой комментарий со слов "смотря чем хочешь заниматься") Я пишу бизнес приложения, огромные и монструозные. Поэтому и назвал Scala и C#)
А я вот занимался разработкой всяких embedded систем, управление промышленным оборудованием, вот это вот все. Традиционно тут писали на C, но в последнее время C++ все больше начинают использовать, потому что банально удобнее, а где надо, там всегда можно написать куски в стиле C. Rust… Ну не знаю — не знаю, язык, который требует танцев с бубном для того, чтобы получить больше одной ссылки на один и тот же объект, в этой области — это такое себе.
Разрабатывая как-то драйвера под Linux на плюсах (да, это возможно), а так же написав в жизни одну прошивку под bare metal, не нашел ничего удобного в плюсах, чего нельзя было бы достичь на сях.
RTTI и исключения придется отключить, бОльшая часть стандартной библиотеки или урезана, или недоступна совсем. Отладка усложняется, потому что сишный код довольно красиво скомпилируется в ассемблер, что важно, т.к. не всегда есть возможность впихнуть отладочный бинарь, а вот плюсовый компилируется в какой-то ад.
Наследование и классы достигаются тупо через структуры с указателями на функции. С контейнерами беда, это да, но в целом, тоже решаемо.
Си, куда более чистый синтаксически и читать его очень приятно. Да, приходится в целом писать чуть больше кода, но поддерживать и отлаживать его просто невероятно приятно.
Например, он стал мультиплатформенным, что перебило самый главный плюс Java.
Так же разработчики открыли исходные коды, что дало возможность сообществу самим развивать платформу.
А в последней версии .NET CORE так вообще производительность стандартных типов на порядок подняли, что повысит производительность в существующей кодовой базе.
На мой взгляд, мест где сейчас требуются языки с прямой возможностью управления памяти все меньше и меньше.
Имхо, если бы из Си++ выпилили бы все легаси конструкции и пересмотрели бы спорные синтаксические конструкции, то порог вхождения понизился бы.
Есть ещё такой весьма неприятный баг clang, произошедший из-за добавления и отката proposal по спискам захвата лямбд.
Clang выдает ошибку
error: 'i' in capture list does not name a variable
error: reference to local binding 'i' declared in enclosing function
при использовании в списке захвата или при захвате лямбдой переменных из structured binding.
auto [i, d, b] = makeTuple();
auto lambda = [=, &i]() {
auto result = b ? 0 : int(i * d);
i *= 2;
return result;
};
WANDBOX
Proposal, который был изменен в R1 и возвращён в R0, в стандарт (N4659) попал R0
Баг clang
(не) Баг GCC, в котором объясняется описанные выше
Пользуясь случаем хотел спросить у знающих людей, как вывести тип std:: function принимающей в качестве аргумента саму себя? Как вы вести тип лямбды понятно, а вот чтобы std:: function, не очень.
«If you really need to capture this..» => «Если вам действительно нужно запечатлеть это..»
Гугл-транслейт — наше всё?
Лямбды: от C++11 до C++20. Часть 2