Russian Qt Forum

Разное => Говорилка => Тема начата: Azazello от Декабрь 05, 2019, 19:51



Название: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 05, 2019, 19:51
Побудоражу сообщество.

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

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

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

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

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



Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 06, 2019, 09:25
Ну у константности известная проблема, что плюсы не делают различения между "физической" (живущей в RO memory) и "логической" константностью.
Отчасти это фиксит constexpr и constexpr!

А так, вам сюда https://stdcpp.ru


Название: Re: c++ новый стандарт (комитет)
Отправлено: _Bers от Декабрь 07, 2019, 13:50
Вот если бы у вас была возможность внести новую фитчу в язык с++, какую бы вы предложили?

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

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

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

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

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

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




Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 07, 2019, 14:29
Вот если бы у вас была возможность внести новую фитчу в язык с++, какую бы вы предложили?

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

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

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

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

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

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


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

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: _Bers от Декабрь 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,
а компалтайм - рекурсивная.



Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 07, 2019, 23:35
а вот cl (компилятор visual studio),
или просто более старые компиляторы не умеют циклы в constexpr функциях.
например, компилятор msvc2015 считается достаточно современным.

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

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

Но, в свете вашего ответа, довольно развернутого и понятного, попрошу ещё и пункт 5 развенуть.
Боюсь я его тоже не правильно понял "из коробки"


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 08, 2019, 02:27
Я понял, _Bers таки норкоман и не в курсе, чем отличается constexpr из с++11 от constexpr из с++14 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html). Спойлер - возможностью писать сложные (больше "одной строки") конструкции. А в с++20/23 ваще new можно будет делать! И дело не в "свежем" или "несвежем" компиляторе, а в его поддержке стандарта. Вон mvc2015 спокойно некоторые минорные фичи с++17 держит. Если некоторые не могут посмотреть табличку (https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance?view=vs-2019) поддерживаемых фич, ну что ж... Беда.
Вот уж не знаю, зачем сидеть на msvc2015, кроме как если у аффтора до сих пор Windows 2000. Ну или есть контра жмотится на новую лицензию.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 09, 2019, 00:15
Я понял, _Bers таки норкоман и не в курсе ....

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

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 09, 2019, 00:28
Какой то злой вы.
Ну, то что вы не Линус Товардс нам понятно :)

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

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 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%
Многие грешат. Это не приемлимо.

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

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

Так что Авварон выдыхайте и приносите знания конкретно, а не все дебилы.
Иначе, по вашим сообщениям, вы приходите в детский сад, чтобы утвердиться.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 09, 2019, 11:58
Я абсолютно в курсе линуксо проблем и древних компиляторов. Нам надо запускаться на системе, в которой стоит gcc4.8.
Говно вопрос - качаем сорцы gcc-9, собираем и таскаем всё с собой. Брат жив, никакой зависимости.

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 09, 2019, 13:07
Не так давно от меня исходило такое предложение
Возможность явно указать квалификатор метода в момент вызова (https://stdcpp.ru/proposals/9b7bc56e-ab7d-4792-805d-babb5d61095c)

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

Код
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
};
 

В частности такой подход приходится использовать в реализации рефлексии.


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

И кстати: а кто такая "рефлексия"?  :)


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 09, 2019, 14:25
Не было бы популярного Lerp - и информации ноль. Ну часто call оператор (та еще мудистика), а так - только "уповать". И разбираться (что выжирает время). Читал про SFINAE, ну смысл примерно понял, но выглядит громоздко и неуклюже. Было бы гораздо лучше иметь какое-то формальное "описание" для template (наподобие описания класса).

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 09, 2019, 14:43
Читал про SFINAE, ну смысл примерно понял, но выглядит громоздко и неуклюже. Было бы гораздо лучше иметь какое-то формальное "описание" для template (наподобие описания класса).

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

И кстати: а кто такая "рефлексия"?  :)

Вкратце (https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))

Конкретно мне необходимо во время компиляции генерировать некоторые типы данных на основе других типов данных.
Интерфейс новых типов зависит от интерфейса базовых.


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

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

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

Формальное описание для шаблонов, как уже сказали, это концепты (https://en.cppreference.com/w/cpp/language/constraints).

И кстати: а кто такая "рефлексия"?  :)

Это такая бабка у подъезда, которая всё про всех знает :). Рефлексия (программирование) (https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)). Только там больше про рефлексию времени выполнения, а C++ ожидают рефлексию времени компиляции. Ищите "c++ reflection ts".


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 09, 2019, 14:52
Конкретно мне необходимо во время компиляции генерировать некоторые типы данных на основе других типов данных.
Интерфейс новых типов зависит от интерфейса базовых.

Рефлексии достаточно, или хотелось бы метаклассов (https://www.fluentcpp.com/2017/08/04/metaclasses-cpp-summary/) :)?


Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 09, 2019, 14:57
Рефлексии достаточно, или хотелось бы метаклассов (https://www.fluentcpp.com/2017/08/04/metaclasses-cpp-summary/) :)?

Метаклассов тоже хотелось бы, даже сильно)). Но они не отменяют необходимость рефлексии.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 09, 2019, 15:13

Конкретно мне необходимо во время компиляции генерировать некоторые типы данных на основе других типов данных.
Интерфейс новых типов зависит от интерфейса базовых.

Что вы так сложно все объясняете. Сложность нужна когда человек погрузился.
Рефлексия  - moc в Qt


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

Код
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; // как-нибудь так
   // или по-другому
};
 


Та елки палки. Что это такое?
Так же с ума можно сойти.
Я вообще ничего не понял.

То один this на null проверяет, второй пишет    
 void method () &&;

Либо я тупой, либо разверните каждую функцию. Извините, но язык программирования важен в деталях.
И если у вас столько функций, а вы хотите! всего лишь превратить их в одну, зачем их столько писать?
Ведь смысл в каждой это оптимизация? Да и, как писалось выше, const это декларативная вещь, типа как private в классе, редко влияет на оптимизацию.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 09, 2019, 15:38
Скажем, вместо пары итераторов binary_search будет принимать "RandomAccessContainer" (ну или какие там требования нужны).
По сути, синтаксический сахар для SFINAE, но открывает кучу всяких возможностей (типа std::sort НАКОНЕЦ-ТО будет принимать один параметр, а не два).

Ну да, ну да.....
Два параметра передавать жопа полная. Тут согласен. Я бы вообще психанул и им не пользовался. Но самое прикольное от НАКОНЕЦ ТО. :))))) Ту уж позвольте над вами поиздеваться :)

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 09, 2019, 16:20
Ну да, ну да.....
Два параметра передавать жопа полная. Тут согласен. Я бы вообще психанул и им не пользовался. Но самое прикольное от НАКОНЕЦ ТО. :))))) Ту уж позвольте над вами поиздеваться :)

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


На самом деле, там "внутри" так и будет пара итераторов, завернутая в range, удовлетворяющий определенному концепту (то, что сейчас сделано через iterator traits).
То есть будет ошибка не вида "итератор шаблонного класса от десятка шаблонных аргументов пофейлил вот эту проверку" а будет "рэнж не удовлетворяет концепту Имярек".
Я пока не разбирался как матчатся рэнжи на std::string_view/std::span (то есть, когда я делаю std::views::all от вектора, я получаю std::span или что?), но в любом случае, там есть куча методов манипуляции с view, проблема что они не все документированы. Но вот пример из доки (https://en.cppreference.com/w/cpp/ranges/all_view)
Код:
    std::vector<int> v{0,1,2,3,4,5};
    for(int n : std::views::all(v) | std::views::take(2) ) {
        std::cout << n << ' ';
    }
печатает "0 1"
То есть получить "кусок" первоначального вектора будет не проблема, вопрос только в синтаксисе

Ну то есть прелесть рэнжей в манипуляциях с самими рэнжами (это что-то типа генераторов в питоне но не совсем), а сортировка от одного параметра это приятный бонус (https://en.cppreference.com/w/cpp/experimental/ranges/algorithm/sort), а не основная фича.


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 09, 2019, 16:23
void method () &&;

А что в этой строке не так? Я такое тоже иногда использую. Можете меня вторым ко второму записать (к первому не надо).

Ну да, ну да.....
Два параметра передавать жопа полная. Тут согласен. Я бы вообще психанул и им не пользовался. Но самое прикольное от НАКОНЕЦ ТО. :))))) Ту уж позвольте над вами поиздеваться :)

Надо мной тогда тоже можете поиздеваться :). Я тоже рад, что в алгоритмы можно будет меньше параметров передавать, а не begin/end'ы постоянно писать.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 09, 2019, 16:39

 void method () &&;


Тогда уж я точно не понимаю. Объсните что-куда перемещается.


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 09, 2019, 16:50
void method () &&;

Тогда уж я точно не понимаю. Объсните что-куда перемещается.

ref-qualified member functions (https://en.cppreference.com/w/cpp/language/member_functions#const-.2C_volatile-.2C_and_ref-qualified_member_functions).


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 09, 2019, 16:58
void method () &&;

Тогда уж я точно не понимаю. Объсните что-куда перемещается.

ref-qualified member functions (https://en.cppreference.com/w/cpp/language/member_functions#const-.2C_volatile-.2C_and_ref-qualified_member_functions).


Прочитал. И что куда перемещается? Без шуток.
 void method () &&;

В чем смысл void? что куда он перемещает?


Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 09, 2019, 17:02
Либо я тупой, либо разверните каждую функцию. Извините, но язык программирования важен в деталях.
И если у вас столько функций, а вы хотите! всего лишь превратить их в одну, зачем их столько писать?
Ведь смысл в каждой это оптимизация? Да и, как писалось выше, const это декларативная вещь, типа как private в классе, редко влияет на оптимизацию.

 ;D ;D ;D ;D ;D

Рефлексия может реализоваться не только дополнительной кодогенерацией типа moc Qt.

Например, захотелось нам реализовать для типа Type обертку Wrapper, да такую, чтобы Wrapper ничем внешне не отличался от Type.
Область применения таких оберток оставим вне рамок данного поста).

Заранее неизвестно, какой набор методов содержит Type. Язык позволяет реализовать 8 вариантов одинаковых методов (модификаторы * типы ссылок).
Таким образом необходимо рефлексировать все возможные варианты при их наличии. Не буду останавливаться на вопросах чем отличаются друг от друга модификаторы или ссылки, так как это относится к базовым знаниям языка.

Пример результата рефлексии,

Код
C++ (Qt)
 
class Type
{
   // ...
   iterator begin ();
   const_iterator begin () const;
   // ...
};
 
// развернутая рефлексия для Wrapper, код достаточно страшный на вид)
 
class Wrapper
{
   Type m_type; // например, Wrapper содержит Type по значению
   // ...
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) volatile & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const volatile & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) volatile && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const volatile && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   // ...
};
 


Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 09, 2019, 17:06
Прочитал. И что куда перемещается? Без шуток.
 void method () &&;

В чем смысл void? что куда он перемещает?

Здесь нет никакого перемещения. Просто описывается интерфейс для rvalue ссылки

Код
C++ (Qt)
 
struct Type
{
   void method () && { ::std::cout << "Hello rvalue method " << ::std::endl; }
};
 
void main ()
{
   Type().method(); // ОК
 
   Type value;
   value.method(); // ERROR
   ::std::move( value ).method(); // OK
}
 


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 09, 2019, 17:09
Прочитал. И что куда перемещается? Без шуток.
 void method () &&;

В чем смысл void? что куда он перемещает?

По ссылке же пример есть, и как раз с void. Он не перемещает, а метод выбирается в зависимости от того, вызывается он для lvalue или rvalue ссылки на объект.


Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 09, 2019, 17:15
Пример результата рефлексии,

... второй раз запостил и все-равно наврал))
правильно будет

Код
C++ (Qt)
 
class Type
{
   // ...
   iterator begin ();
   const_iterator begin () const;
   // ...
};
 
// развернутая рефлексия для Wrapper, код достаточно страшный на вид)
 
class Wrapper
{
   Type m_type; // например, Wrapper содержит Type по значению
   // ...
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) & { /*additional code*/; return static_cast< Type & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const & { /*additional code*/; return static_cast< Type const & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) volatile & { /*additional code*/; return static_cast< Type volatile & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const volatile & { /*additional code*/; return static_cast< Type const volatile & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const && { /*additional code*/; return static_cast<Type const && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) volatile && { /*additional code*/; return static_cast<Type volatile && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
   decltype(auto) begin ( _Arguments && ... arguments ) const volatile && { /*additional code*/; return static_cast<Type const volatile && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }
 
   // ...
};
 

сходство рефлективных методов налицо).


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 09, 2019, 17:31
Прочитал. И что куда перемещается? Без шуток.
 void method () &&;

В чем смысл void? что куда он перемещает?

Здесь нет никакого перемещения. Просто описывается интерфейс для rvalue ссылки

Код
C++ (Qt)
 
struct Type
{
   void method () && { ::std::cout << "Hello rvalue method " << ::std::endl; }
};
 
void main ()
{
   Type().method(); // ОК
 
   Type value;
   value.method(); // ERROR
   ::std::move( value ).method(); // OK
}
 

Что Ок.
В том то и дело, что это бессмысленно. Не смыслва в void method() &&. Он по фунционалу ничем не будет отличаться от void method().  Такие вещи, демонстрирующие, что что-то компилируется, но не объясняющие суть, просто введут в ступор человека ,не знакомым с данной технологией. Многие побоятся спросить (чтобы не показаться глупыми), будут читать выше наведенные документации, где тоже std::cout << "Hello rvalue method " << ::std::endl; Честно, меня ввело в ступор - все говорят что нужно, но не говорят зачем. Затем дают заднюю....

Может где то это конструкция и нужна теоретически, но вы же не объяснили в чем смысл void method() &&

Как по мне, ваш пример для понимания "должен" выглядеть так.

Код:
class Test {
public:
    Test(): mData(100,100) {}

    std::vector<int> clear() &&  { return std::move(mData); }

private:
    std::vector<int> mData;
};

int main() {
    Test t;
    std::vector<int> r = std::move(t).clear(); //move data
}

Поэтому для меня многие описанные выше методы не имеют смысла и начинаешь задуматся не о теме разговора, а о том, что "что то упустил". Откуда я знаю, приводите вы реальные вещи или "а это для примера". Вон Igors для примера this c null сравнивал, так заклевали :)

Код:
template < typename ... _Arguments,  typename = ::std::enable_if_t< подходящий метод для _Type существует > >
    decltype(auto) begin ( _Arguments && ... arguments ) & { /*additional code*/; return static_cast< Type & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }

Какое все вырвиглазное.............................
Но смысл понятен.

 



Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 10, 2019, 07:48
Что Ок.
В том то и дело, что это бессмысленно. Не смыслва в void method() &&. Он по фунционалу ничем не будет отличаться от void method().  Такие вещи, демонстрирующие, что что-то компилируется, но не объясняющие суть, просто введут в ступор человека ,не знакомым с данной технологией. Многие побоятся спросить (чтобы не показаться глупыми), будут читать выше наведенные документации, где тоже std::cout << "Hello rvalue method " << ::std::endl; Честно, меня ввело в ступор - все говорят что нужно, но не говорят зачем. Затем дают заднюю....

Может где то это конструкция и нужна теоретически, но вы же не объяснили в чем смысл void method() &&

Единственный смысл
Код
C++ (Qt)
void method() &&
это ограничение возможности его вызова. Он может быть вызван только с помощью rvalue. Именно этим он и отличается от обычного
Код
C++ (Qt)
void method()
Если на практике еще не встречались с таким ограничением, это не значит, что это бессмысленно.
Например, хочется чтобы экземпляр объекта был обязательно распределен где-то в памяти (стек или куча) перед тем, как будет вызван какой-либо его метод (кроме конструктора), помечаем методы &. Что это дает? Экземпляр такого объекта обязательно имеет адрес в памяти. В отличие, например, от временного объекта, который вполне может быть распределен в регистрах процессора. Методы && предполагают обратные ограничения (экземпляр такого объекта не обязательно имеет адрес в памяти). И ничего больше.

Затруднений в понимании этого вопроса совсем не возникло, поэтому казалось, что вопрос тривиальный).

Как по мне, ваш пример для понимания "должен" выглядеть так.

Для меня как раз этот пример кажется странным и сложным (нетрадиционным) в использовании, но, в принципе, возможным для применения.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Igors от Декабрь 10, 2019, 12:41
Не знаю, что такое Lerp и что должно быть понятно из вашего примера,
При таком отношении к предметной части Вы обречены :'( Ладно, считаем Вы пошутили. Lerp обычно синоним "линейной интерполяции"
Код
C++ (Qt)
template<class T>
T Lerp( const T & a, cont T & b, double w )
{
 return a * (1.0 - w) + b * w;
}
 
Предполагается что T поддерживает арифметиику, но средствами языка это никак не утверждается
но в с++20\23 будут "концепты (https://en.cppreference.com/w/cpp/language/constraints)".
Ага, занимаются, хорошо, значит мои пожелания не так уж глупы  :)


Название: Re: c++ новый стандарт (комитет)
Отправлено: Igors от Декабрь 10, 2019, 12:51
А что именно делает функция - это другой вопрос. Тут нужно либо искусство ёмко и понятно называть сущности, либо писать для них документацию.
Ставился вопрос/задача не "что делает", а "что должен иметь" (тот T) для того чтобы что-то делать



Название: Re: c++ новый стандарт (комитет)
Отправлено: Igors от Декабрь 10, 2019, 13:08
Например, хочется чтобы экземпляр объекта был обязательно распределен где-то в памяти (стек или куча) перед тем, как будет вызван какой-либо его метод (кроме конструктора), помечаем методы &. Что это дает? Экземпляр такого объекта обязательно имеет адрес в памяти. В отличие, например, от временного объекта, который вполне может быть распределен в регистрах процессора. Методы && предполагают обратные ограничения (экземпляр такого объекта не обязательно имеет адрес в памяти). И ничего больше.
Теперь понял, спасибо.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 10, 2019, 13:09
При таком отношении к предметной части Вы обречены :'( Ладно, считаем Вы пошутили. Lerp обычно синоним "линейной интерполяции"

Про "линейную интерполяцию" я слышал где-то курсе на втором лет 10 назад в универе. С тех пор, верите, нет, ни в одной предметной области не пригодилось.
У меня проблемы более приземленные - вот тут без мьютекса в строчку лезут, вот тут вообще объект удалился в другом треде, вот тут за пределы буфера выходят потому что забыли проверить размер этого буфера, вот тут забыли free() позвать, вот тут кутешники забыли free() позвать... Какая предметная область, вы чего? :D


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 10, 2019, 13:17
Теперь понял, спасибо.

Ну типичный пример это QImage::mirrored (https://doc.qt.io/qt-5/qimage.html#mirrored-1), если объект временный, то можно использовать его внутренний буфер и не копировать всю картинку, а прямо внутри "отразить".
В отличие от неконстантного метода, такой подход позволяет писать более "функциональный" код - объекты не меняются, то есть нет побочных эффектов, но при этом всё достаточно эффективно - нужна старая картинка, ну получите копию (будет медленнее), не нужна - ну напишите std::move чтобы явно показать намерение "выкинуть" старую картинку - зато эффективно и не мутабельно при этом.


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 10, 2019, 14:13
Ставился вопрос/задача не "что делает", а "что должен иметь" (тот T) для того чтобы что-то делать

С такой сигнатурой:
Код
C++ (Qt)
template<class T>
T Lerp( const T & a, const T & b, double w );
действительно много чего можно передать. Функция заявляет, что сможет работать практически с любыми типами T. Что вряд ли.

В С++20 можно будет писать, например, как-то так:
Код
C++ (Qt)
#include <QPoint>
#include <QVector3D>
#include <QDebug>
 
template <typename T>
concept Arithmetic =
   requires(T a, T b)
{
   a + b;
   a - b;
};
 
Arithmetic Lerp(const Arithmetic& a, const Arithmetic& b, double w)
{ return (b - a) * w; }
 
int main()
{
   qDebug() << Lerp(0, 10, 0.3);
   qDebug() << Lerp(QPoint{0, 0}, QPoint{10, 10}, 0.5);
   qDebug() << Lerp(QVector3D{0, 0, 0}, QVector3D{10, 10, 10}, 0.7);
 
   return 0;
}

Вывод:
Цитировать
3
QPoint(5,5)
QVector3D(7, 7, 7)

Так лучше? :)


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 10, 2019, 14:18
ViTech

Вроде бы там разговоры о таком синтаксисе идут
Код:
template<Arithmetic T>
T Lerp(const T& a, const T& b, double w)

или
Код:
auto Arithmetic Lerp(const auto Arithmetic& a, const auto Arithmetic& b, double w)

Но это не точно :)


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 10, 2019, 14:31
ViTech

Вроде бы там разговоры о таком синтаксисе идут
Код:
template<Arithmetic T>
T Lerp(const T& a, const T& b, double w)

или
Код:
auto Arithmetic Lerp(const auto Arithmetic& a, const auto Arithmetic& b, double w)

Но это не точно :)

Тот пример я компилировал у себя прямо сейчас :). А вообще оба варианта работают. По крайней мере в текущем у меня gcc.

В смысле такие два варианта:
Код
C++ (Qt)
Arithmetic Lerp(const Arithmetic& a, const Arithmetic& b, double w);
 
template <Arithmetic T> T LerpT(const T& a, const T& b, double w);

С auto в концептах вроде тоже что-то видел, но нужно вспоминать, что именно :).


Название: Re: c++ новый стандарт (комитет)
Отправлено: Igors от Декабрь 10, 2019, 14:36
Так лучше? :)
Намного, это то что я хотел. Только в содержательной части насвистели, (b - a) тоже можно, но тогда так
Код
C++ (Qt)
Arithmetic Lerp(const Arithmetic& a, const Arithmetic& b, double w)
{ return a + (b - a) * w; }
}
И боюсь что без этого ни до каких тонкостей языка дело не дойдет  :'(


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 10, 2019, 15:13

Тот пример я компилировал у себя прямо сейчас :). А вообще оба варианта работают. По крайней мере в текущем у меня gcc.


А, прикольно. Просто там есть "проблема" что непонятно, что есть шаблонная функция, принимающая концепт, а что обычная функция, принимающая тип.
Но, возможно, это не проблема для компилятора (только для читающего) и на неё решили забить=)


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 10, 2019, 17:53
Например, хочется чтобы экземпляр объекта был обязательно распределен где-то в памяти (стек или куча) перед тем, как будет вызван какой-либо его метод (кроме конструктора), помечаем методы &. Что это дает? Экземпляр такого объекта обязательно имеет адрес в памяти. В отличие, например, от временного объекта, который вполне может быть распределен в регистрах процессора. Методы && предполагают обратные ограничения (экземпляр такого объекта не обязательно имеет адрес в памяти). И ничего больше.
Теперь понял, спасибо.

Что тут понятного, тут вообще ничего понятного нету.

Цитата: ssoft
   Например, хочется чтобы экземпляр объекта был обязательно распределен где-то в памяти (стек или куча) перед тем, как будет вызван какой-либо его метод помечаем методы &.

Ага, а если не пометить, то экземпляр объекта не будет обязательно распределен в памяти?

Т.е. если я напишу Test t, то что, распределение объекта в памяти зависит от наличия & для метода? Какая ерунда. Я следую инструкции написаной вами выше, и просто продолжаю размышления (отнесём к неясности выражения мысли). Возможно вы имеете в виду такую временность, Test().funct() &&? Что тоже ерунда, т.к. вы утрверждаете что this внутри этого объекта может не существать (цитата: т.к. экземпляр такого объекта не обязательно имеет адрес в памяти). Размазан по регистрам? По каким правилам?  

Пока что для меня void T::method() && таки до сих пор не имеет смысла.

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

Я тоже часто пишу "чтобы было"
Код:
   class {
 
   const T& value() const   { return ...}
   T value() { return .. }
}

Заметте, для компилятора вызов этих методов одинаков. Я то  на уровне программиста оптимизировал тип возвращаемого значения на ссылку, тем самым предотвратив копирование, надеясь, что это ограничит клиентов этого метода на уровне соглашения - не надо делать const_cast. Отвечаешь за последствия ты. Но компилятор то уж точно здесь ни при чем.

В вашем же случае я вообще не могу ничего оптимизировать. Это просто дублирование кода.

Никаких отличий для компилятора, как бы эти функции не были помечены  - & или && или просто классическая не имеют. Это просто перегрузка. Просто дополнительные квалификаторы. Реализация "временного объекта" берет на себя программист. И вызов std::move лишь вызовет соответствующум функцию, а она может просто копировать. Все.

Пока буду считать так, если мне никто не ткнет обратное.
Вообще путаница конечно.
Термин временный объект подразумевает, что вы его будете куда то передавать, этож не технология компилятора, это просто принятые соглашения разработки, жить то он может вечно :)

Как и термина "глобальная переменная" не существуют для компилятора (как и локальная), хотя все мы этим термином успешно пользуемся.
Хотя существует понятие стековой и переменной в куче (для компилятора).

Это я к чему эту дребень развел? Чтобы понять, на каком уровне мы находимся? На уровене компилятора? Для него нет оптимизации фунций с его точки зрения (& или && или const  в отличии от noexcept, finnaly....). Если на уровне программиста, то есть.


Название: Re: c++ новый стандарт (комитет)
Отправлено: ViTech от Декабрь 10, 2019, 19:15
Цитата: ssoft
   Например, хочется чтобы экземпляр объекта был обязательно распределен где-то в памяти (стек или куча) перед тем, как будет вызван какой-либо его метод помечаем методы &.

Ага, а если не пометить, то экземпляр объекта не будет обязательно распределен в памяти?

Если пометить только method() &, то у временного(rvalue) объекта нельзя будет такой метод вызвать.

Пример (https://coliru.stacked-crooked.com/a/34e4c40358cd7a70):
Код
C++ (Qt)
#include <iostream>
 
struct S
{
   void f()& { std::cout << "lvalue\n"; }
};
 
int main()
{
   S s;
   s.f();            // prints "lvalue"
   std::move(s).f(); // error
   S().f();          // error
}

Пока что для меня void T::method() таки до сих пор не имеет смысла.

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 10, 2019, 19:30

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

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

void method()

и void method() &&.

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

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

Я наверное неясно изъясняюсь. Но стремлюсь!

Вон Авваррон какие простыни пишет, никто с ним не спорит. Наверное думает, что что-то умное сказал, и все согласились.
На самом деле просто никто ничего не понял.

Ну или Igors - ну понятно! Ну, вам понятно, помогите  мне понять.

Тут же R/W пользователей с десяток, не больше. О чем общаться? Все в исходниках. Все всё прошли. Но какое желание держать лицо. Та давайте опустимся чуть ниже, все же фигню иногда делают. Все чего-то недопонимают. Но только попытка объяснить что либо вскрывает многие свои пробелы.

К примеру, я тоже доказывал что private virtual функция не имеет никакого смысла, думал - БОЖЕ, ЭТОЖЕ ОСНОВЫ.
Ну, правда, до сих пор смысла не понимаю, зачем они так сделали, но таки она работает, успешно компилируется и благодаря Маерсу (запретил бы его, как и Александреску) часто используется.



Название: Re: c++ новый стандарт (комитет)
Отправлено: ssoft от Декабрь 11, 2019, 08:19
Цитата: ssoft
    Например, хочется чтобы экземпляр объекта был обязательно распределен где-то в памяти (стек или куча) перед тем, как будет вызван какой-либо его метод помечаем методы &.

Ага, а если не пометить, то экземпляр объекта не будет обязательно распределен в памяти?

Т.е. если я напишу Test t, то что, распределение объекта в памяти зависит от наличия & для метода? ...

 ;D Не, не, не. Я такого не писал). Возможность вызова метода & зависит от того, распределен ли объект в памяти.

Что тоже ерунда, т.к. вы утрверждаете что this внутри этого объекта может не существать (цитата: т.к. экземпляр такого объекта не обязательно имеет адрес в памяти). Размазан по регистрам? По каким правилам? 

Если явно this не используете внутри, экземпляр объекта умещается в регистры и компилятор может выполнить соответствующую оптимизацию, то почему бы и нет.
Посмотрите, например, сюда https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2015/may/compilers-what-every-programmer-should-know-about-compiler-optimizations-part-2

Это я к чему эту дребень развел? Чтобы понять, на каком уровне мы находимся? На уровене компилятора? Для него нет оптимизации фунций с его точки зрения (& или && или const  в отличии от noexcept, finnaly....). Если на уровне программиста, то есть.

Явное указание & или && для метода - это оптимизация уровня программиста, конечно.

Попробую примеры сформулировать.

1. Реализация какого-нибудь вычислителя с хранением результата вычислений.

Код
C++ (Qt)
struct Calculator
{
   using Values = ::std::vector< double >;
 
   Calculator ( Values values )
   {
       m_squared.reserve( values.size() );
       for ( const auto & value, values )
       {
               m_squared.push_back( value * value );
       }
   }
 
   Values squared () & { return m_squared; }; // get squared by coping
   Values squared () && { return ::std::move( m_squared ); }; // get squared by moving
 
private:
   Values m_squared;
};
 
void foo ()
{
   Calculator::Values v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
   Calculator calculator( v );
   auto squared_by_coping = calculator.squared(); // coping
   auto squared_by_moving = Calculator( v ).squared(); // moving
}
 

2. Запрет использования методов, если объект не является rvalue

Код
C++ (Qt)
class Logging
{
   using Pattern = ::std::string;
   using Key = ::std::string;
   using Value = ::std::string;
 
   Logging ( Pattern ) { /*формирование шаблона сообщения*/ }
   ~Logging () {} { /*вывод в файл/консоль/и т.п.*/ }
   Logging && arg ( Key key, Value value ) && { /*заполнение полей шаблона сообщения*/ };
};
 
void foo ()
{
   Logging( "Hello, ${username}!" ).arg( "username", "German" ); // так работает
 
   Logging log( "Hello, ${username}!" );
   log.arg( "username", "German" ); // а такое использование запрещено
}
 


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 11, 2019, 09:54
Запрет использования методов, если объект не является rvalue

Ладно, будем считать что убедили.
Подправте мои выводы:

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


Название: Re: c++ новый стандарт (комитет)
Отправлено: Igors от Декабрь 11, 2019, 14:44
Ну или Igors - ну понятно! Ну, вам понятно, помогите  мне понять.
Случай не такой уж фантастичный. Напр объект имеет уникальное ID, хорошо если можно отделаться железно запретив копирование, но это не всегда удается. И тогда выгодно знать или это "нормальный" объект или "времянка" что скоро убьется (не обращайте внимание на мелкие подробности типа "регистров" и.т.п). "Руками" выходит довольно коряво


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 11, 2019, 21:00
Я уже вот тоже думаю, чего это я так прицепился, ну есть, то есть. Значит кому то нужно.
Хочу закрыть тему.

Часто использую академический С++, где важен сам пример и принцип, поэтому такое внимание к деталям - это к чему: типа чего приципился.

Нашел академическое применение данного метода.

Код:
class Logging {

bool connectToLogServer();
bool isConnected();

void logging(std::string& msg) { if (!isConnected()) return; std::cout << msg; }
void logging(std::string& msg) && { connectToLogServer(); std::cout << msg; }

}

Использование понятно - создав объект постоянным, мы экономим ресурсы на подсоединения к серверу, раз подсоединившись и пуляя сообщения.

Код:
{
    Logging log;
    log.connectToLogServer();

    log.logging("sfsfds");
    log.logging("sfsfds2");

}

Когда же нам нужно "здесь и сейчас", мы вызываем "временную функцию".

Код:
Logging().logging("sfsfds");

Почему же оно академическое? Мы не знаем, записало оно или нет. Но думаю есть  случаи где это не важно (на то он и лог, в какой лог писать, что лог не работает), а во вторых есть исключения (exception).

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

Код:
void logging(std::string& msg) 
{
     if (!isConnected())
             connectToLogServer();
     if (!isConnected())
          return;

      std::cout << msg;
 }

 И тогда выгода только в краткости синтаксиса. Но пропустим это :)

Короче, хочет чел делать без возврата, та и пусть делает, видно для него это имеет смысл. Для меня не приобрел.

А сдругой стороны, кому в этом мире помешала проверка this на null? Да никому.



Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 11, 2019, 21:39
Академичности ради, пример с void и реф-реф, действительно, плохой.

"Обычная" void функция обычно имеет сайд-эффект в том, что она меняет сам объект (например, void std::vector<T>::clear()). Иные сайд эффекты (как то изменение глобальных объектов) - это фу-фу-фу и всеми (справедливо) ругается.

В случае с void foo() && у функции (почти) нет никаких вариантов, кроме как изменить глобальный стейт (запись в лог - это пример такого изменения). Ведь делать что-то с объектом бессмысленно - он вот сейчас будет разрушен и никому (уже) не нужен. А изменение глобального стейта это фу-фу-фу и неакадемично.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 11, 2019, 21:46
Академичности ради, пример с void и реф-реф, действительно, плохой.

"Обычная" void функция обычно имеет сайд-эффект в том, что она меняет сам объект (например, void std::vector<T>::clear()). Иные сайд эффекты (как то изменение глобальных объектов) - это фу-фу-фу и всеми (справедливо) ругается.

В случае с void foo() && у функции (почти) нет никаких вариантов, кроме как изменить глобальный стейт (запись в лог - это пример такого изменения). Ведь делать что-то с объектом бессмысленно - он вот сейчас будет разрушен и никому (уже) не нужен. А изменение глобального стейта это фу-фу-фу и неакадемично.

От блядь. Ну понимашь, вылез в конце.
Я уже гармонию со всеми нашёл, а вы по второму кругу :)

Ну так привидите пример, когда void && имеет смысл хоть какой. Я тему закрывал, что-бы холивар закрыть. А вы так ХРЯСЬ.

Академичность бывает разная, в зависимоти от курса, уровня заведения и т.д.
В одном случае рассказываем что от 3-5 не имеет смысла, в другом, что получится -2.

НО!, логгирование это и есть смысл глобальной переменной. Уж извените, вы не подумав сказали. QSettings вам в пример. У нас так всегда, начали за упокой, закончили глобальными переменными.


Название: Re: c++ новый стандарт (комитет)
Отправлено: Авварон от Декабрь 11, 2019, 21:54
От блядь. Ну понимашь, вылез в конце.
Я уже гармонию со всеми нашёл, а вы по второму кругу :)

Ну так привидите пример, когда void && имеет смысл хоть какой. Я тему закрывал, что-бы холивар закрыть. А вы так ХРЯСЬ.

Я так-то с тобой согласен что пример изначальный говно=)


Название: Re: c++ новый стандарт (комитет)
Отправлено: Azazello от Декабрь 11, 2019, 22:28
Кстати, ssoft, отдельная благодарность за отзывчивость и понятность ваших объяснений. А также за труд, когда вы писали исходники.

И Igors, за отзывчивость и желание помогать.

Но господи! Перестаньте писать, в том, в чем вы не уверены!
Я думаю, что ответ на stackoverflow вы бы писали с тщательность в 10 раз больше.

Хорошо. Я уж вас точно не лечу, я вас подначиваю :)



Название: Re: c++ новый стандарт (комитет)
Отправлено: _Bers от Январь 29, 2020, 12:00
Я понял, _Bers таки норкоман и не в курсе, чем отличается constexpr из с++11 от constexpr из с++14 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html).

ты походу сам там чего то употребляешь.
иначе как ещё ты мог сделать такие выводы?

Вот уж не знаю, зачем сидеть на msvc2015, кроме как если у аффтора до сих пор Windows 2000. Ну или есть контра жмотится на новую лицензию.

судя по тупости вопроса, ты - не профессионал?

бизнес инертный.
он очень медленно модернизируется, и только при необходимости.

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



Название: Re: c++ новый стандарт (комитет)
Отправлено: _Bers от Январь 29, 2020, 12:08
Но, в свете вашего ответа, довольно развернутого и понятного, попрошу ещё и пункт 5 развенуть.
Боюсь я его тоже не правильно понял "из коробки"

сегодня виртуальные функции не могут быть шаблонными.

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

Код:
struct base
{
    template<class t>
    virtual void foo(const t&) = 0;
};

struct der: base
{
    template<class t>
    virtual void foo(const t&) {}
   
};

struct some {};

int main()
{
    der d;
    base& b = d;
   
    some v;
    b.foo(v);
    // --- приводит к инстанцированию
    // virtual void base::foo(const some&) = 0;
    // virtual void der::foo(const some&){}   
    // и так для всех наследников
}



поддержка шаблоно-виртуальных функций позволит реализовать на с++ полноценную динамику
(динамические типы данных любой сложности. как в скриптовых языках)
без приседаний вокруг type erasure







Название: Re: c++ новый стандарт (комитет)
Отправлено: _Bers от Январь 29, 2020, 12:12
Ну только норкоман будет прелагать полечить "старый компилятор" введением фичи в новый стандарт.
Примерно похожая фича, кстати, обсуждается - constexpr!
Не очень, правда, ясно, как фича из 20го\23го стандарта решит проблему древнего msvc2015...

это был лишь пример пример ситуации,
где такая фича была бы очень кстати.

можно привести и другие примеры.

в стандарт, кстати, данную фичу таки утвердили:
https://en.cppreference.com/w/cpp/language/consteval