LINUX.ORG.RU

Стандарт C++20 утверждён

 


2

10

https://www.reddit.com/r/cpp/comments/f47x4o/202002_prague_iso_c_committee_trip_report_c20_is/

Желающие могут попробовать написать новость.

По виду std::format больше похож на fmt, чем на boost::format, что не может не радовать.

Небольшой обзор есть в статье на Хабре: https://m.habr.com/ru/company/yandex/blog/488588/ от Антона Полухина.

★★★★★

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

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

С моей точки зрения, «оппонент» - это противник в интеллектуальном противоборстве. А слово «противник» подразумевает, с моей точки зрения, примерную равность обоих сторон, иначе противоборства просто нет.

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

nim годится для системщины

пригодность же не определяется тем сколько вакансий на заборе, так и тем, что кто-то смог..

автор rust вообще ушел пилить swift, но тем не менее, apple набирает разрабов пилить низкий уровень для облака на rust

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

А слово «противник» подразумевает, с моей точки зрения, примерную равность обоих сторон

И с чего бы это?

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

иначе противоборства просто нет.

Логично, что ложный вывод проистекает из ложных предпосылок. Противоборство вовсе не должно быть равным. Как и длительным, зрелищным, честным и пр.

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

У раста за исключением объявления функций, типов и параметров (которые заимствованы из OCaml) сишный или точнее C++ подобный

Ингриденты, конечно, важны, но их тоже нужно уметь красиво приготовить и подать. А так уж получается, что открывая код на Rust, хочется сразу же его развидеть. В отличие от других мейнстримных языков.

П.С. Схожее впечатление можно получить, если не зная толком С++, открыть реализацию STL. Будет сплошной WTF, как это писали и читали. Только там это спрятано, а тут это типичный код.

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

Предположим, хомяк забрался на дерево и спрыгнул оттуда на слона, намереваясь переломать тому хребет. Я не могу назвать это противоборством, а двух этих животных - противниками.

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

Я не могу назвать это противоборством, а двух этих животных - противниками.

Из того, что вы чего-то не можете, вовсе не значит, что этого нет.

eao197 ★★★★★
()

кстати а в ссылке Антона, вот такой пример:

#include <cstdlib>
#include <iostream>

struct X { int a, b; };

X *make_x() {
  X *p = (X*)malloc(sizeof(struct X));
  p->a = 1;
  p->b = 2;
  return p;
}

int main() {
    X *ptr = make_x();
    std::cout << ptr->a << ' ' << ptr->b << std::endl;
    return 0;
}

и объяснение что что-то там си с битами работает а си++ с объектами и типа такой код не будет работать, типа это UB, но блин я не понял его объяснение и где там вообще UB, часто подобное видел не только в Си но и в Си++ и все работало, ну и в принципе где там ub то может быть?

Создаётся автоматическая-переменная указатель, в неё вносится значение из malloc, далее двум переменным присваивается значение, причем в этой точке программы гарантируется что будет существовать объект, ведь malloc уже возвратил управление (опустим ситуацию что malloc может не выделить память, т.к. явно не про это речь в статье по ссылке)

Ну а дальше значение, хранимое в локальном указателе передаётся в возвращаемое ф-ей значение и все, когда произойдет выход из ф-ии никто никакие действи я указателем (с теми байтами на стеке, которые он занимал) делать не будет - это простейший тип, для них никаих деструкторов не предусмотрено, да и если бы был не простейший - то ф-я та ф-я возвращает копию этого объекта - так что это тоже не важно. В итоге не пойму про что он там :(

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

итоге не пойму про что он там :(

память не инициализирована - там любой мусор может быть и разыменование атрибутов - UB

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

ред полный.


ну, бред, но не полный же. если бы там не int, а указатели были.
p->a->b = 1

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

и, теперь, когда тебе с указателем пример понятен, представь что другой тип тоже как указатель - требует инициализации. в т.ч. int

но вообще для меня это странно, ведь cc умеет отличать POD типы.

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

си с битами работает битами

Перечитай ещё раз этот момент.

На сколько я понял, в точке успешного вызова маллока будет существовать только кусок выделенной памяти, а не объект, так как конструктор структуры не был вызван.

Если утрировано, new == malloc()/aligned_alloc() + construction call, а delete == destruction call + free().

+ понятное дело, всякие нюансы с выравниваниями.

P.S. Поправьте, если неграмотно высказался.

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

Очень неграмотно, но поправлять влом.

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

примерно так. и поскольку компилитор не конструировал объекты, то он вправе предпринять какие-либо действия.

впрочем, сс знает о POD типах и разрешает memcpy, так что этот пункт скорее всего формальность.

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

кстати а в ссылке Антона, вот такой пример

Не нужно слушать перепевы рабиновичей. Открой оригинал пропозала.

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

На сколько я понял, в точке успешного вызова маллока будет существовать только кусок выделенной памяти, а не объект, так как конструктор структуры не был вызван.

Всё так, но ведь это примитивнейшая структура, поэтому после подсказки компилятору как воспринимать кусок памяти X *p = (X*) - никакого конструктора уже не требуется.

Я попробовал этот код в разных gcc и msvc - везде работает, и хз что автор имел ввиду.

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

Я попробовал этот код в разных gcc и msvc - везде работает

Вот код. Его поведение не определено. Но везде «работает».

#include <climits>

int main()
{
    int i = CHAR_MAX + 1;
    char c = reinterpret_cast<char&>(i); // UB
}
anonymous
()
Ответ на: комментарий от bonta

но ведь это примитивнейшая структура

вот именно понятие примитивнейшей структуры (POD) и подвергается изменениям от стандарта к стандарту. ужас, конечно.

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

Но этот пример не объясняет мой вопрос, и тут даже пример какой-то искусственный кто-будет к ссылке число приводить то… Т.е. код выглядит как искусственный пример. А код из той статьи выглядит пусть и не красиво (malloc в C++, приведения типов в Си стиле, использование ручного выделения памяти) но абсолютно работоспособным, и где в нём UB?

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

Ну ты наверное хотел сказать не изменениям а дополнениям и уточнениям?

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

А код из той статьи выглядит пусть и не красиво (malloc в C++, приведения типов в Си стиле, использование ручного выделения памяти) но абсолютно работоспособным, и где в нём UB?

Открой уже оригинал и почитай.

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

Но этот пример не объясняет мой вопрос, и тут даже пример какой-то искусственный

Ну почему искусственный. Люди говорят, что это якобы читает первый байт. (Правда, по стандарту это не так).

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

о абсолютно работоспособным, и где в нём UB?

вот он раньше был «абсолютно работоспособным» лишь по-недоразумению, с точки зрения cc это UB.

во такой вот язык..

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

Были «легальны» до C++17. В кавычках потому что старый wording нельзя считать корректным.

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

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

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

Люди просто используют constexpr функции, заменяют указатели на функции лямбдами, и т.д.,это не что-то особенное, требующее проектирования

А-ля PHP

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

Не надо путать проектирование архитектуры с проектированием реализации вплоть до каджой строчки

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

Что-то ты как-то слабо глушишь клоуна. Начни с from.

anonymous
()
8 сентября 2020 г.
Ответ на: комментарий от eao197

Нет. Не надо тут 4.2. сплошное писать. Просто свой cmake на коленке написать проще чем воевать с имеющейся системой сборки и дергать тот же autotools через msys.

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

Нет. Не надо тут 4.2. сплошное писать.

В комментарии, на который вы решили ответить, было сказано:

a) в vcpkg поддерживается только CMake;

b) vcpkg является специфическим менеджером зависимостей.

Могли бы вы уточнить, к какому из этих утверждений относятся ваши «Нет» и «4.2. сплошное»?

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

И при чем здесь это?

Я бы еще понял, если бы вы на vcpkg_configure_* сослались.

Ссылку на документацию о том, как в vckpg добавить библиотеку без CMake-овских portfiles можно увидеть?

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

portfile - это просто точка входа для vcpkg откуда начинается сборка. Дальше он дергает уже vcpkg_build_* и потом немного подчищает артефакты. Ничего общего с системой сборки самого порта не имеет.

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

это просто точка входа для vcpkg откуда начинается сборка

Без этой точки входа вы в vcpkg ничего не засунете. А засунуть можно только обмазовшись CMake. И ничем другим.

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

Аргументировано :D https://github.com/microsoft/vcpkg/blob/master/ports/python3/portfile.cmake

Вы сами прекрасно аргументируете мою точку зрения приводя в пример скрипт на 250LOC, который для vcpkg может быть написан только на CMake и ни на чем больше.

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

vcpkg_execute_process() и вперед.

Ваш «вперед» закончится тем, что vcpkg_execute_process вам придется вызвать в написанном на CMake portfile.

CMake(система сборки) != CMake(script mode)

Если вам приятно думать, что vckpg отвязан от CMake или поддерживает что-то кроме CMake, то нет проблем.

Только вот если человеку, который знает autotools или meson, потребуется запихнуть свою библиотеку в vcpkg, то ему потребуется еще и освоить CMake. И знания autotools/meson ему здесь не помогут. В отличии от знаний CMake.

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

Только вот если человеку, который знает autotools или meson, потребуется запихнуть свою библиотеку в vcpkg

Ему потребуется освоить vcpkg и ту скриптоту которая там используется.

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