Russian Qt Forum
Ноябрь 22, 2024, 10:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: c++ новый стандарт (комитет)  (Прочитано 26346 раз)
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« : Декабрь 05, 2019, 19:51 »

Побудоражу сообщество.

У меня когда раздумье, переключаюсь на другие задачи. Сейчас выпал форум.

Вот если бы у вас была возможность внести новую фитчу в язык с++, какую бы вы предложили?

Без глубинного анализа!

Я бы запулил: "Запрет на разыменование const", const - всегда const, ничего не может его сделать другим. Ну, и понятно, mutable заодно грохнется.

Опять же, поймите иронию, не надо говорить про совместимость и бла, бла, бла....
Как по щучему веленью. Просто на уровне желаний без последствий.

« Последнее редактирование: Декабрь 05, 2019, 20:01 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Декабрь 06, 2019, 09:25 »

Ну у константности известная проблема, что плюсы не делают различения между "физической" (живущей в RO memory) и "логической" константностью.
Отчасти это фиксит constexpr и constexpr!

А так, вам сюда https://stdcpp.ru
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #2 : Декабрь 07, 2019, 13:50 »

Вот если бы у вас была возможность внести новую фитчу в язык с++, какую бы вы предложили?

1.
рефлексия, которую обещать обещали,
да так и не завезли.

2.
перегрузку для функций,
которые исполняются времени компиляции,
и времени выполнения.

3.
проверялка компилябельности кода с человеческим лицом.

в настоящий момент подобные проверки делаются через SFINAE.
код получается довольно таки замороченный.

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

5.
шаблонно-виртуальные функции-члены.


Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #3 : Декабрь 07, 2019, 14:29 »

Вот если бы у вас была возможность внести новую фитчу в язык с++, какую бы вы предложили?

1.
рефлексия, которую обещать обещали,
да так и не завезли.

2.
перегрузку для функций,
которые исполняются времени компиляции,
и времени выполнения.

3.
проверялка компилябельности кода с человеческим лицом.

в настоящий момент подобные проверки делаются через SFINAE.
код получается довольно таки замороченный.

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

5.
шаблонно-виртуальные функции-члены.


Со знанием дела....
Но вы говорите больше про удобство, чем про революцию.
Разве что кроме пункта 2.

Не могли бы вы его развернуть?
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #4 : Декабрь 07, 2019, 22:56 »

Не могли бы вы его развернуть?

приведу простой пример.
нужно вычислить длину строки.

Код:
template<class s>
constexpr size_t strlen(const s& text) noexcept;

функция помечена как constexpr.
значит она должна уметь выполняться во время компиляции.

рассмотрим её возможную реализацию:

https://rextester.com/RYXCM16729

Код:
#include <iostream>
#include <cassert>

template<class s>
constexpr size_t strlen(const s& text) noexcept
{
    assert(text);
    const auto* cur = text;
    while(*cur != 0)
        ++cur;
    return static_cast<size_t>(cur - text);
}

int main()
{
    enum { len = strlen("1234") };
    std::cout << "len = " << len << '\n';
}

как мы видим: функция действительно вычисляет размер времени компиляции.
вот только это - новый gcc.

а вот cl (компилятор visual studio),
или просто более старые компиляторы не умеют циклы в constexpr функциях.

например, компилятор msvc2015 считается достаточно современным.
и активно используется для продакшена.
но он не может скомпилировать такой код:
https://rextester.com/FJJE91869

Код:
source_file.cpp(16): error C2131: expression did not evaluate to a constant
source_file.cpp(16): note: failure was caused by call of undefined function or one not declared 'constexpr'
source_file.cpp(16): note: see usage of 'strlen'
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

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

вот если бы мы могли различать:
с этими аргументами запустится рантайм-версия функции,
а вот с такими - компалтайм версия,
тогда мы могли бы реализовать две версии:

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

Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #5 : Декабрь 07, 2019, 23:35 »

а вот cl (компилятор visual studio),
или просто более старые компиляторы не умеют циклы в constexpr функциях.
например, компилятор msvc2015 считается достаточно современным.

Мммм.....
Гм......
Не могу описать ощущения....
И даже не могу представить, почему это так принципиально для вас.

Но, всё таки, вы знаете что оно прийдёт, чуть попозже, но прийдёт.

Но, в свете вашего ответа, довольно развернутого и понятного, попрошу ещё и пункт 5 развенуть.
Боюсь я его тоже не правильно понял "из коробки"
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Декабрь 08, 2019, 02:27 »

Я понял, _Bers таки норкоман и не в курсе, чем отличается constexpr из с++11 от constexpr из с++14. Спойлер - возможностью писать сложные (больше "одной строки") конструкции. А в с++20/23 ваще new можно будет делать! И дело не в "свежем" или "несвежем" компиляторе, а в его поддержке стандарта. Вон mvc2015 спокойно некоторые минорные фичи с++17 держит. Если некоторые не могут посмотреть табличку поддерживаемых фич, ну что ж... Беда.
Вот уж не знаю, зачем сидеть на msvc2015, кроме как если у аффтора до сих пор Windows 2000. Ну или есть контра жмотится на новую лицензию.
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #7 : Декабрь 09, 2019, 00:15 »

Я понял, _Bers таки норкоман и не в курсе ....

Какой то злой вы.
Ну, то что вы не Линус Товардс нам понятно Улыбающийся

Мизантроп, среди вас есть мизантроп?  
Да, я мизантроп. Что случилось?
Здесь человеку плохо. Наслаждайтесь!
« Последнее редактирование: Декабрь 09, 2019, 00:28 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Декабрь 09, 2019, 00:28 »

Какой то злой вы.
Ну, то что вы не Линус Товардс нам понятно Улыбающийся

Мизантроп, среди вас есть мизантроп?   
Да, я мизантроп. Что случилось?
Здесь человеку плохо. Наслаждайтесь!

Ну только норкоман будет прелагать полечить "старый компилятор" введением фичи в новый стандарт.
Примерно похожая фича, кстати, обсуждается - constexpr!
Не очень, правда, ясно, как фича из 20го\23го стандарта решит проблему древнего msvc2015...
Записан
Azazello
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #9 : Декабрь 09, 2019, 00:28 »

Какой то злой вы.
Ну, то что вы не Линус Товардс нам понятно Улыбающийся

Мизантроп, среди вас есть мизантроп?  
Да, я мизантроп. Что случилось?
Здесь человеку плохо. Наслаждайтесь!

Ну только норкоман будет прелагать полечить "старый компилятор" введением фичи в новый стандарт.
Примерно похожая фича, кстати, обсуждается - constexpr!
Не очень, правда, ясно, как фича из 20го\23го стандарта решит проблему древнего msvc2015...

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

Возьмем Линукс.
Based on Qt 5.13.2 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit- QtCreator (установка с сайта Qt)
gcc version 9.2.0 (Gentoo 9.2.0-r2 p3)  - система.
Разница обалдеть, не правда?

Да вспомните VS 6, сколько она держалась, когда С++ "похоронили"! Лет 5-7 точно (в плане С++)

Неужели вам, взрослому человеку не понятно, что С++ позволяет всем жить довольно успешно в собственном мире, не пересекаясь с другими?

Это не я умный, это все остальный тупые Улыбающийся

Какой критерий успеха? Знания?
Для меня Александреску вреден, кому то икона. Особенно подосрал, когда сказал что всё фигня и ушёл в D со сборщиком мусора.

Какой? Деньги?
Тогда Бил Гейц молодец, а Линус Товардс лошара полная.

У вас свой критерий. Но если, вы, как то можете именно в С++ сказать:
Критерий - это знания языка по максимуму - вас засмеют. Поэтому не скажете.

Ну, тут вот скажу что не приемлемо.
Утверждать однозначно что-либо, что сам не проверил и не уверен в этом на 100%
Многие грешат. Это не приемлимо.

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

Трагичнее куда гораздо больше, когда дурак выдает себя за умного. (Это не про вас и кого либо на форуме). В остальном все ерунда.

Так что Авварон выдыхайте и приносите знания конкретно, а не все дебилы.
Иначе, по вашим сообщениям, вы приходите в детский сад, чтобы утвердиться.
« Последнее редактирование: Декабрь 09, 2019, 01:24 от Azazello » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Декабрь 09, 2019, 11:58 »

Я абсолютно в курсе линуксо проблем и древних компиляторов. Нам надо запускаться на системе, в которой стоит gcc4.8.
Говно вопрос - качаем сорцы gcc-9, собираем и таскаем всё с собой. Брат жив, никакой зависимости.

Касательно msvc2015, если я не ошибаюсь, то у него тот же рантайм (140), что и у 17й и 19й студии, то есть нет вообще никакой причины не апгрейдиться до 2017\2019.
Вот при апгрейде с 13й студии надо пересобирать всё бинарное говно с новым рантаймом, это да
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #11 : Декабрь 09, 2019, 13:07 »

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

Также я бы предложил иметь возможность использования шаблонизации для квалификаторов и типов ссылок.
То есть, если имеется несколько методов

Код
C++ (Qt)
class X
{
   void method () &;
   void method () const &;
   void method () volatile &;
   void method () const volatile &;
   void method () &&;
   void method () const &&;
   void method () volatile &&;
   void method () const volatile &&;
};
 

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

Код
C++ (Qt)
class X
{
   void method () mutable, const &, volatile &&, const volatile; // как-нибудь так
   // или по-другому
};
 

иначе до сих пор приходится писать реализацию через макроопределения

Код
C++ (Qt)
 
#define METHOD_PROTOTYPE( refer ) ...
 
#define METHOD \
   METHOD_PROTOTYPE( && ) \
   METHOD_PROTOTYPE( const && ) \
   METHOD_PROTOTYPE( volatile && ) \
   METHOD_PROTOTYPE( const volatile && ) \
   METHOD_PROTOTYPE( & ) \
   METHOD_PROTOTYPE( const & ) \
   METHOD_PROTOTYPE( volatile & ) \
   METHOD_PROTOTYPE( const volatile & ) \
 
class X
{
   METHOD
};
 

В частности такой подход приходится использовать в реализации рефлексии.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 09, 2019, 14:07 »

В соседней теме - жаркие споры типа "нужно писать так чтобы по объявлению было ясно, а не уповать ..". А что понятно по объявлению template ?
Код
C++ (Qt)
template<class T>
T Lerp( const T & a, const T & b, double w );
 
Не было бы популярного Lerp - и информации ноль. Ну часто call оператор (та еще мудистика), а так - только "уповать". И разбираться (что выжирает время). Читал про SFINAE, ну смысл примерно понял, но выглядит громоздко и неуклюже. Было бы гораздо лучше иметь какое-то формальное "описание" для template (наподобие описания класса).

И кстати: а кто такая "рефлексия"?  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Декабрь 09, 2019, 14:25 »

Не было бы популярного Lerp - и информации ноль. Ну часто call оператор (та еще мудистика), а так - только "уповать". И разбираться (что выжирает время). Читал про SFINAE, ну смысл примерно понял, но выглядит громоздко и неуклюже. Было бы гораздо лучше иметь какое-то формальное "описание" для template (наподобие описания класса).

Не знаю, что такое Lerp и что должно быть понятно из вашего примера, но в с++20\23 будут "концепты".
Скажем, вместо пары итераторов binary_search будет принимать "RandomAccessContainer" (ну или какие там требования нужны).
По сути, синтаксический сахар для SFINAE, но открывает кучу всяких возможностей (типа std::sort НАКОНЕЦ-ТО будет принимать один параметр, а не два).
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #14 : Декабрь 09, 2019, 14:43 »

Читал про SFINAE, ну смысл примерно понял, но выглядит громоздко и неуклюже. Было бы гораздо лучше иметь какое-то формальное "описание" для template (наподобие описания класса).

Эту проблему пытаются решить с помощью концептов.

И кстати: а кто такая "рефлексия"?  Улыбающийся

Вкратце

Конкретно мне необходимо во время компиляции генерировать некоторые типы данных на основе других типов данных.
Интерфейс новых типов зависит от интерфейса базовых.
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.235 секунд. Запросов: 23.