LINUX.ORG.RU

Вести с полей стандартизации C++: C++20 design is complete (Kona, 2019-02)

 


4

4

На Reddit-е появился большой пост с описанием того, что вошло в C++20 в результате очередного заседания комитета. На этой встрече в С++20 включили:

Modules!

Coroutines!

static, thread_local, and lambda capture for structured bindings.

std::polymorphic_allocator<>.

std::midpoint and std::lerp.

std::execution::unseq execution policy.

std::ssize() free function that returns a signed size.

std::span usability enhancements.

Precalculated hash values in lookup.

На следующей встрече в июне 2019-го будут рассматриваться к включению в C++20 следующие предложения (принципиально они уже одобрены, но до сих пор не были включены из-за незавершености формальных спецификаций):

Expansion statements.

The C++20 synchronization library.

std::format.

constexpr std::vector.

Allow constexpr allocation, but disallow allocations that are not deleted at compile time.

constexpr std::type_info::operator==.

New conceptification of iterators.

Monadic operations for std::optional.

std::source_location.

std::flatmap.

std::flatset.

std::ostream_joiner.

Stack trace library.

std::byteswap.

constinit.

Deprecating some uses of volatile.

Implicit creation of objects for low-level object manipulation.

using enum.

Ну и до кучи указывается, что еще было добавлено в C++20 ранее:

Concepts.

Contracts.

Ranges.

operator<=>.

A lot more constexpr features: consteval functions, std::is_constant_evaluated, constexpr union, constexpr try and catch, constexpr dynamic_cast and typeid.

Feature test macros.

std::span.

Synchronized output.

std::atomic_ref.

За подробностями лучше сходить на Reddit, там много поясняющего текста. Так же можно почитать отчет Херба Саттера.

★★★★★

Последнее исправление: eao197 (всего исправлений: 1)

Ответ на: удаленный комментарий

я же не про модули, пусть будут, я про Rust :)

bonta ★★★★★
()
Ответ на: удаленный комментарий

А что нужно?

Развивать старые кодовые базы на C++, например. Ибо это сильно дешевле переписывания на Rust. Особенно если в коде ООП и шаблонное метапрограммирование во все поля.

eao197 ★★★★★
() автор топика
Ответ на: удаленный комментарий

Толку то от них:

  • Одно неудобное написание заменили еще более неудобным написанием
  • Ускорение сборки незначительное(хотя и не для этого модули вводились). Если код сильно затемплейчен, то шило на мыло.
  • Не решают проблем с инстанциированием одних и тех же шаблонов в разных местах с теми же параметрами.
  • Безобразие в виде смешивания двух подходов - includes и modules. Конечно, понятно, что для legacy, но выглядит отвратно.

Если это первый шаг к получению настоящей модульности, то хорошо. Иначе зачем?

P.S. Всё вышесказанное является лишь моим мнением (сформировавшимся при просмотре обзоров Modules TS с примерами использования, а также при чтении TS merging modules по диагонали), ничем больше.

IceRain
()

Кстати, а когда void станет уже полноценным типом, у которого появится наконец-то собственное значение как в той же растишке?

dave ★★★★★
()
Ответ на: комментарий от hateyoufeel

Я бы не стал обобщать на все организации, имеющие на балансе большие кодовые базы.

На и Iron_Bug — это какой-то клинический случай. За свою карьеру подобных упоротых людей встречал всего несколько раз, всегда на осколках бывших советских предприятий, перебивающихся госзаказами. В компаниях, которые живут за счет собственного софта, с этим гораздо лучше. Но как в крупных конторах, вроде Yandex или ЛК — не знаю, чем более компания, тем больше там места для разных отклонений.

Но у меня выборка все-таки небольшая.

eao197 ★★★★★
() автор топика

Implicit creation of objects for low-level object manipulation.

Будет забавно, если не примут. И если примут — тоже.

anonymous
()
Ответ на: комментарий от dave

void в С/C++ это вроде как две разные вещи. В возвращаемом значении функции он работает примерно как unit type из Rust. При использовании void *, void - неспецифицированный тип.

red75prim ★★★
()
Ответ на: комментарий от red75prim

Я о возвращаемом значении. Если говорить даже о C++17, то нет, не эквивалентен unit type, к большому моему сожалению. Из-за чего, кстати, я подозреваю, then для future в C++20 выглядит (выглядел??) именно как future<T> -> (future<T> -> future<U>) -> future<U>, а не как положено было бы future<T> -> (T -> future<U>) -> future<U>.

dave ★★★★★
()
Ответ на: комментарий от red75prim

То есть, в C++17 ты не можешь передать аргумент типа void. А из-за этого ломаются привычные приемы ФП. Это может быть важно при написании шаблонов. Важно для тех же фьюч.

Вот, мне и интересно, не исправили ли в C++20?

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 2)
Ответ на: комментарий от eao197

Просто ей больше по душе C. Но она об этом говорит в ветках обсуждающих С++.

anonymous
()

Я только тупо классами пользуюсь, даже без виртуальных функций и даже без шаблонов (разве что кутэшных). А тут напридумывали понимаешь, этим кто-то пользуется?

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

Хотя вот модули... Ну может будет полезно.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

В void есть элемент, это не пустое множество. Как тогда функции возвращающие void выполнялись бы?

vlad9486
()
auto tup = std::make_tuple(0, ‘a’, 3.14);
for... (auto elem : tup)
    std::cout << elem << std::endl;
int f(int i) [[expects: i > 0]] [[ensures audit x: x < 1]]; 

wtf?!

std::format

Stack trace library

Monadic operations for std::optional

Хотеть!

И эти люди говорят что Rust сложный. Да он примитивный!

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ах да, make_tuple протух, как и многое подобное. Можно просто tuple{0, 'a', 3.1}

anonymous
()
Ответ на: комментарий от RazrFalcon

Про весовые категории крестов/раста по сложности и возможностям.

anonymous
()
Ответ на: комментарий от RazrFalcon

А может, просто поставить один жирный крест на нём?)

Deleted
()
Ответ на: комментарий от eao197

На и Iron_Bug — это какой-то клинический случай.

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

С другой стороны, это вообще довольно распространённая черта среди фанатов любого языка. Возьми среднего фаната JS, который повсюду ноду суёт, и грезит Web 3.0.

hateyoufeel ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

А тут напридумывали понимаешь, этим кто-то пользуется?

Представьте себе.

Я вам даже больше скажу, мне сложно припомнить какую-либо из включенных в стандарт C++ фич, которая не была бы кому-нибудь очень-очень нужна.

Даже выпиленные в конце-концов из C++ export template и спецификация исключений изначально были кому-то нужны. А export template даже казались очень хорошей идеей.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Среди ребят, которые ничего кроме C++ в жизни не видели, таких довольно много.

Я таких где-то с 2005-го года не видел, наверное. Т.е. чтобы человек владел только C++.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

wtf?!

Design By Contract. Довольно-таки любопытная технология, которая ранее искаропки была доступна разве что в Eiffel и D (ну и в экспериментальном Spec# от Microsoft). В D мне как-то не зашло, а вот в Eiffel эта штука используется легко и естественно, и приводит к более понятному коду.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Да даже на лоре у каждого языка найдётся такой фанбой.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это типа if? Рантайм или статика? Что будет если условие не выполнится?

Я не знаком с предложением для C++, но в D и в Eiffel контракты проверяются в Run-Time. Если контракт не выполняется, то выбрасывается исключение (но в Eiffel свои исключения, не такие как в C++). Причем в Eiffel можно управлять тем, какая часть контрактов будет проверяться в Run-Time: все (т.е. invariants, post и pre), только post и pre, только pre. Обычно при отладке используют уровень «все», в релиз сборка идет либо с только pre, либо с полностью отключенными контрактами.

В принципе, компилятор может воспринимать условия из контракта для того, чтобы генерировать наиболее оптимальный код. Так что контракты будут оказывать влияние и на Run-Time, и на поведение компилятора в compile-time.

Плюс к тому контракты могут использоваться статическими анализаторами для более продвинутых диагностик.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Просто std::terminate, полагаю. Если собрано в режиме прерывания работы при нарушении контракта. Контракты следует рассматривать как вариант assert-ов. Что естественно.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от maxis11

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Если мне ничего новее C++98 не нужно, являюсь ли я очень плохим программистом?

Эка вас крутануло. Из того, что вы не знаете, кому нужны новые возможности C++, вовсе не следует, что вы плохой программист. Как и не следует, что вы хороший. Плохой/хороший программист — это про работу, а не про знание языков.

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

Серьезно ответить на этот вопрос можно лишь сделав ревью вашего кода. Но есть подозрение, что использование range-for loops, лямбд или auto способно сделать ваш код лаконичнее. А применение constexpr и шаблонов — эффективнее.

eao197 ★★★★★
() автор топика
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

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

А выделить недельку, самому всё изучить и решить для себя никак? Разве не интересно узнавать что-нибудь новое?

theNamelessOne ★★★★★
()
Ответ на: комментарий от seiken

Спасибо, поправил. Все ссылки — это копипаста с Reddit-а. Видимо там в начале так было.

eao197 ★★★★★
() автор топика

Ура модулям! Почти не надеялся. Вместе с концептами, контрактами и рэйнджами - выходит весьма приятный язык. Субъективно не хватает только паттерн-матчинга.

Тем более, афаик, это первое появление контрактов в мейнстриме.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

Если мне ничего новее C++98 не нужно, являюсь ли я очень плохим программистом?

Да, причём на фундаментальном уровне.

rustforever
()
Ответ на: комментарий от I-Love-Microsoft

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

variadic template, auto, move semantic, constexpr - это уж точно вещи которые сильно улучшают жизнь. Да и в библиотеки там вкусностей хватает.

Dudraug ★★★★★
()
Ответ на: комментарий от eao197

что использование range-for loops

плюсую в том числе.

Dudraug ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

мне ничего новее C++98 не нужно

Даже C++03 не используешь?!

anonymous
()
Ответ на: комментарий от anonymous

Ура модулям!

Модули почти не отличаются от заголовков (по сути, аккуратно написанный заголовок - это почти модуль). Модули делают ровно то же, что и заголовочные файлы - вводят в область видимости единицы трансляции имена. Только делают это чуть аккуратнее за счет того, что работают на уровне языка, а не текстового препроцессора (имена введенные в первом импорте не влияют на работу второго, т.е. порядок импортов может быть любой, они независимы). В результате модули по мелочи улучшили решение задачи, которая решалась заголовочными файлами, но кардинально ничего не изменили (возможно, когда появится опыт работы с модулями, что-то поменяется, как когда придумали шаблоны, а потом появилось метапрограммирование в современном виде). Скорость сборки, которую все так ждали (а на самом деле, которая никому по факту не нужна) почти не изменилась (хорошо написанный заголовок даст ту же скорость компиляции, а влияние, хоть и небольшое на скорость модули оказывают за счет ленивости - если имя из модуля не используется, файл модуля (бинарная база, а не текстовый файл, который надо парсить) даже с диска не считывается).

Модули - нужная вещь, но ничего кардинально нового они не дадут.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.