Открыть список
Как стать автором
Обновить

Комментарии 29

auto foo() {
return [this] { print(); };
}

Круглых скобочек на хватает после [this]?

Хмммм… А компилятор сожрал.
Это какой-то новый синтаксис? С каких пор?

Да вроде даже в С++11 можно было не указывать пустые круглые скобки, если у лямбды параметров не было.

С 11-ого стандарта ещё, то есть с самого начала. 5.1.2.4:
If a lambda-expression does not include a lambda-declarator, it is as if the lambda-declarator were ().
Лмбды без аргументов не требуют () начиная с С++11, такое поведение было всегда.
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, может доживём до кучи вакансий на него :-)
Это ж сильно зависит от предметной области. Где-то и Питона хватит, где-то принято в основном писать на Java/C#, а еще где-то C++ фактически безальтернативен. One size does not fit all.

Rust вполне себе альтернатива плюсам. А там где не альтернатива, скорее всего нужен Си, а не Си++. Си, в свою очередь, рекомендую выучить вообще всем, хотя бы на уровне "одну книжку прочитал".


Вообще, я и начал свой комментарий со слов "смотря чем хочешь заниматься") Я пишу бизнес приложения, огромные и монструозные. Поэтому и назвал Scala и C#)

А я вот занимался разработкой всяких embedded систем, управление промышленным оборудованием, вот это вот все. Традиционно тут писали на C, но в последнее время C++ все больше начинают использовать, потому что банально удобнее, а где надо, там всегда можно написать куски в стиле C. Rust… Ну не знаю — не знаю, язык, который требует танцев с бубном для того, чтобы получить больше одной ссылки на один и тот же объект, в этой области — это такое себе.

Разрабатывая как-то драйвера под Linux на плюсах (да, это возможно), а так же написав в жизни одну прошивку под bare metal, не нашел ничего удобного в плюсах, чего нельзя было бы достичь на сях.


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


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


Си, куда более чистый синтаксически и читать его очень приятно. Да, приходится в целом писать чуть больше кода, но поддерживать и отлаживать его просто невероятно приятно.

Так-то развитие C# идет огромными шагами.
Например, он стал мультиплатформенным, что перебило самый главный плюс Java.
Так же разработчики открыли исходные коды, что дало возможность сообществу самим развивать платформу.

А в последней версии .NET CORE так вообще производительность стандартных типов на порядок подняли, что повысит производительность в существующей кодовой базе.

На мой взгляд, мест где сейчас требуются языки с прямой возможностью управления памяти все меньше и меньше.
Да, если сравнивать лаконичной и изящность C# с Си++, то разница на лицо.

Имхо, если бы из Си++ выпилили бы все легаси конструкции и пересмотрели бы спорные синтаксические конструкции, то порог вхождения понизился бы.

Если бы это сделали — получился бы Rust :) Rust — это С++ без боли и отчаяния :)

Есть ещё такой весьма неприятный баг 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.


Вот этот код не скомпилируется clang
    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, в котором объясняется описанные выше

Немного не в тему:
А кто-нибудь знаком с рекламируемым курсом обучения?
Хотелось бы узнать мнение сообщества на его счет.
У нас есть чат в телеграмме, в котором много студентов, как действующих, так и уже выпустившихся, а также преподаватели. Можете спросить у них, чтоб узнать мнение, так сказать из первых уст t.me/joinchat/AAAAAAo-Vju7cjFSfjZeeg

Пользуясь случаем хотел спросить у знающих людей, как вывести тип std:: function принимающей в качестве аргумента саму себя? Как вы вести тип лямбды понятно, а вот чтобы std:: function, не очень.

боюсь что такое нельзя сделать, если нужна рекурсия то можно просто захватить
std::function<void()> tmp = [&tmp]()
{
    tmp();
}

Захват не подходит

Из описания я понял, что Вы хотите учинить бесконечную compile-time-рекурсию, а это illformed.
Код взят отсюда
auto callSelf = [](auto& func) {func(func);};
callSelf(callSelf);

Вопрос, как сделать из этого std:: function?
Условие выхода из рекурсии хотя бы предусмотрено?

Ну это смотря куда выходить

«We have also clarifications related to capturing this» => «У нас также есть разъяснения, связанные с захватом этого»

«If you really need to capture this..» => «Если вам действительно нужно запечатлеть это..»

Гугл-транслейт — наше всё?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Информация

Дата основания
Местоположение
Россия
Сайт
otus.ru
Численность
51–100 человек
Дата регистрации
Представитель
OTUS

Блог на Хабре