Value Semantics (CppCon 2022)
От: Videoman Россия https://hts.tv/
Дата: 09.01.23 14:38
Оценка: 22 (3)
Вроде бы простой банальный доклад чувака из Adobe, а с другой стороны не совсем. Основные посылы:
— С++ отлично поддерживает value types, поэтому используйте эту возможность по максимуму, где это возможно и не будете иметь каскад описанных в докладе проблем.
— Reference types — тоже самое, что глобальные переменные, поэтому избегайте эту семантику как только можете.
  Value Semantics: Safety, Independence, Projection, & Future of Programming — Dave Abrahams CppCon 22
Value Semantics: Safety, Independence, Projection, & Future of Programming — Dave Abrahams CppCon 22
А интересным он показался мне потому, что я, неосознанно, сам начал скатываться к тем же методам что используются в докладе, но не мог четко обосновать самому себе. Особенно актуально в свете массовой многопоточки и параллельности.
Интересно мнение коллег, кто что думает на эту тему?
Отредактировано 09.01.2023 15:33 Videoman . Предыдущая версия .
Re[2]: Value Semantics (CppCon 2022)
От: Videoman Россия https://hts.tv/
Дата: 10.01.23 07:56
Оценка: +1 :)
Здравствуйте, Vamp, Вы писали:

V>Abrahams — кто угодно, но только не банальный чувак. Это он придумал метапрограммирование в С++ (с Dimov).


Да я и не утверждал, что Абрахамс банальный. Банальный — понятие относительное. Доклад становится банальным, когда ты сам до всех этих выводов и практик дошел практически, но без обоснований, а потом смотришь доклад и думаешь: за мной следят!
Re[2]: cref<> in<>
От: rg45 СССР  
Дата: 04.02.23 17:24
Оценка: 4 (1)
Здравствуйте, Sm0ke, Вы писали:

S>https://cpp.godbolt.org/z/ETjzoKhKj


S>cref<T> это простой алиас на const T &


S>
S>template <typename T>
S>using cref = const T &;
S>


Тут проблемка есть: при таком определении, cref<T> — не всегда константная ссылка, например:

http://coliru.stacked-crooked.com/a/f110a7aead6d4f5d

#include <iostream>

template <typename T>
using cref = const T &;

template <typename T>
cref<T> make_cref(T&& t) { return cref<T>(t); }

int main()
{
    int i = 42;

    make_cref(i) = 666;

    std::cout << i << std::endl; // -> 666
}

Зачем это нужно вообше? Чтоб еще больше запутать тех, кто и так путается?

S>std::array мувать смысла видимо нет, вот для него и ref<> сойдёт.


Ну, как посмотреть. Если это, например, std::array<std::unique_ptr<HardThing>, N>, то очень даже есть смысл.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.02.2023 18:34 rg45 . Предыдущая версия . Еще …
Отредактировано 04.02.2023 18:30 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 18:29 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 18:04 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:49 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:40 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:38 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:37 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:32 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:29 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:28 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 17:26 rg45 . Предыдущая версия .
Re[4]: Value Semantics (CppCon 2022)
От: sergii.p  
Дата: 09.01.23 19:57
Оценка: +1
Здравствуйте, σ, Вы писали:

σ>Полистал слайды, ничего специфичного для более новых плюсов. Да и вообще маловато материала.


там же приводится пример с методом sort когда вектор принимается по значению. В доисторических плюсах получили бы минимум одно копирование вектора.
Re[4]: Value Semantics (CppCon 2022)
От: σ  
Дата: 10.01.23 15:02
Оценка: +1
BFE>при сортировке будет брошено исключение

🤡
Re[8]: Value Semantics (CppCon 2022)
От: night beast СССР  
Дата: 28.01.23 12:15
Оценка: +1
Здравствуйте, ути-пути, Вы писали:

NB>>то есть это его надо благодарить за то что коллекцию библиотек превратили в хренов монолит, вытащить что-то из которого тот еще геморрой?


УП>А я так и не понял, зачем оттуда что-то вытаскивать. Место на диске экономить? Или какие-то религиозные заморочки?

УП>Что не используешь — то не мешает. Зато установить можно разом, а не возиться из-за каждой новой понадобившейся фичи.

затем что мне не нужно в проекте то, что я не использую
если кто-то тащит к себе всякое г-но со своими зависимостями, только потому что это модно, то это его личные трудности.
Re: Value Semantics (CppCon 2022)
От: σ  
Дата: 09.01.23 14:46
Оценка:
По-моему, доклады про Value Semantics есть каждый год

V>- Reference types — тоже самое, что глобальные переменные, поэтому избегайте эту семантику как только можете.

Бойан как минимум 10-летней давности https://sean-parent.stlab.cc/presentations/2013-09-24-value-semantics/value-semantics.pdf#page=29
Отредактировано 09.01.2023 15:53 σ . Предыдущая версия . Еще …
Отредактировано 09.01.2023 14:56 σ . Предыдущая версия .
Отредактировано 09.01.2023 14:54 σ . Предыдущая версия .
Re[2]: Value Semantics (CppCon 2022)
От: Videoman Россия https://hts.tv/
Дата: 09.01.23 15:12
Оценка:
Здравствуйте, σ, Вы писали:

σ>Бойан как минимум 10-летней давности https://sean-parent.stlab.cc/presentations/2013-09-24-value-semantics/value-semantics.pdf#page=29


Ну так мнение твоё интересно. 10 лет назад давно было, С++ только только стал — С++11.
Re[3]: Value Semantics (CppCon 2022)
От: σ  
Дата: 09.01.23 17:59
Оценка:
σ>>Бойан как минимум 10-летней давности https://sean-parent.stlab.cc/presentations/2013-09-24-value-semantics/value-semantics.pdf#page=29

V>Ну так мнение твоё интересно. 10 лет назад давно было, С++ только только стал — С++11.


Полистал слайды, ничего специфичного для более новых плюсов. Да и вообще маловато материала.
Re[5]: Value Semantics (CppCon 2022)
От: σ  
Дата: 09.01.23 20:04
Оценка:
σ>>Полистал слайды, ничего специфичного для более новых плюсов. Да и вообще маловато материала.

SP>там же приводится пример с методом sort когда вектор принимается по значению. В доисторических плюсах получили бы минимум одно копирование вектора.


Доисторических — это каких? Более новых — это чем C++11.
Re[6]: Value Semantics (CppCon 2022)
От: Videoman Россия https://hts.tv/
Дата: 09.01.23 21:04
Оценка:
Здравствуйте, σ, Вы писали:

σ>Доисторических — это каких? Более новых — это чем C++11.


Ты привел старый доклад на тему value semantics и всё. Мнение не понятно: с чем согласен, с чем нет?
Re[7]: Value Semantics (CppCon 2022)
От: σ  
Дата: 09.01.23 22:27
Оценка:
V>с чем согласен, с чем нет?

С обоими.

Ну да, идёя хорошая. Применять, к сожалению, не приходилось.

Что же до контента, то всё что там есть в презентациях (про Value Semantics, про Type Erasure) было обcосано в видео Шон Пэрена 2012-2017 годов, а текстом наверняка ещё раньше, скорее всего даже в 90-х.
80+% докладов на CppCon повторяется из года в год.
Отредактировано 10.01.2023 7:30 σ . Предыдущая версия .
Re: Value Semantics (CppCon 2022)
От: Vamp Россия  
Дата: 10.01.23 03:14
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Вроде бы простой банальный доклад чувака из Adobe, а с другой стороны не совсем. Основные посылы:


V>[cut=Value Semantics: Safety, Independence, Projection, & Future of Programming — Dave Abrahams CppCon 22]

Abrahams — кто угодно, но только не банальный чувак. Это он придумал метапрограммирование в С++ (с Dimov).
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Value Semantics (CppCon 2022)
От: night beast СССР  
Дата: 10.01.23 07:53
Оценка:
Здравствуйте, Vamp, Вы писали:

V>>Вроде бы простой банальный доклад чувака из Adobe, а с другой стороны не совсем. Основные посылы:


V>Abrahams — кто угодно, но только не банальный чувак. Это он придумал метапрограммирование в С++ (с Dimov).


чего это вдруг?
какие библиотеки он (Abrahams) разработал?
Отредактировано 10.01.2023 7:53 night beast . Предыдущая версия .
Re[3]: Value Semantics (CppCon 2022)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.01.23 09:06
Оценка:
Здравствуйте, night beast, Вы писали:

NB>чего это вдруг?

NB>какие библиотеки он (Abrahams) разработал?

boost, например. Exception safety в stl.
P.S. Интересно, что потом он ушёл делать swift for TensorFlow
Re[4]: Value Semantics (CppCon 2022)
От: night beast СССР  
Дата: 10.01.23 09:14
Оценка:
Здравствуйте, Nuzhny, Вы писали:

NB>>чего это вдруг?

NB>>какие библиотеки он (Abrahams) разработал?

N>boost, например.


буст это коллекция библиотек разных авторов.
какую конкретно в бусте сделал лично он?

N>Exception safety в stl.


про Exception safety я читал не у Абрахамса. он точно первый начал про это говорить?
ну и к метапрограммированию это не сильно относится.
Re[5]: Value Semantics (CppCon 2022)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.01.23 09:26
Оценка:
Здравствуйте, night beast, Вы писали:

NB>буст это коллекция библиотек разных авторов.

NB>какую конкретно в бусте сделал лично он?

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

N>>Exception safety в stl.

NB>про Exception safety я читал не у Абрахамса. он точно первый начал про это говорить?

Я не сказал, что он первым начал об этом говорит, он принёс это в boost и STL. Возможно, что и первый в таком свете.

NB>ну и к метапрограммированию это не сильно относится.


Он в принципе один из первых это начал продвигать в семинарах и статьях, потом книгу написал.
Re[6]: Value Semantics (CppCon 2022)
От: night beast СССР  
Дата: 10.01.23 10:25
Оценка:
Здравствуйте, Nuzhny, Вы писали:

NB>>какую конкретно в бусте сделал лично он?


N>Он один из основателей буста в принципе и автор более чем 3-х тысяч коммитов. Там дохера модулей, в которых он указан автором.


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

N>Можно сказать, что также играл роль архитектора проекта в целом.


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

N>>>Exception safety в stl.

NB>>про Exception safety я читал не у Абрахамса. он точно первый начал про это говорить?

N>Я не сказал, что он первым начал об этом говорит, он принёс это в boost и STL. Возможно, что и первый в таком свете.


как то мелковато для "основателя метапрограммирования"

NB>>ну и к метапрограммированию это не сильно относится.

N>Он в принципе один из первых это начал продвигать в семинарах и статьях, потом книгу написал.

вроде бы, книгу написал Алексей Гуртовой (автор mpl), а Абрахамс там соавтором. но это не точно.
Re[7]: Value Semantics (CppCon 2022)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.01.23 10:33
Оценка:
Здравствуйте, night beast, Вы писали:

NB>здесь можно посмотреть, каких именно.

NB>чего-то выдающегося не увидел

9 библиотек, причём от уже 13 лет им не занимается. Неплохо.

NB>то есть это его надо благодарить за то что коллекцию библиотек превратили в хренов монолит, вытащить что-то из которого тот еще геморрой?


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

NB>как то мелковато для "основателя метапрограммирования"


?!!

NB>вроде бы, книгу написал Алексей Гуртовой (автор mpl), а Абрахамс там соавтором. но это не точно.


Обычно, кто первый указан в списке соавторов, тот больше и написал.
Re[8]: Value Semantics (CppCon 2022)
От: night beast СССР  
Дата: 10.01.23 11:10
Оценка:
Здравствуйте, Nuzhny, Вы писали:

NB>>здесь можно посмотреть, каких именно.

NB>>чего-то выдающегося не увидел

N>9 библиотек, причём от уже 13 лет им не занимается. Неплохо.


посмотри, в скольких из них он является единственным автором.

NB>>то есть это его надо благодарить за то что коллекцию библиотек превратили в хренов монолит, вытащить что-то из которого тот еще геморрой?


N>В первую очередь, он создал коллекцию библиотек, раньше её не было. Создал свою систему сборки, документирования и тестирования. Превратил всё это чуть ли не во вторую стандартную библиотеку, плацдарм для исследования идей и новых библиотек. Роль буста в С++ сложно переоценить.


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

NB>>вроде бы, книгу написал Алексей Гуртовой (автор mpl), а Абрахамс там соавтором. но это не точно.

N>Обычно, кто первый указан в списке соавторов, тот больше и написал.

совсем не обязательно. ты книгу читал?
Re[9]: Value Semantics (CppCon 2022)
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.01.23 11:19
Оценка:
Здравствуйте, night beast, Вы писали:

NB>совсем не обязательно. ты книгу читал?


Да, сто лет назад вместе с книгой Александреску.
Re[10]: Value Semantics (CppCon 2022)
От: night beast СССР  
Дата: 10.01.23 11:25
Оценка:
Здравствуйте, Nuzhny, Вы писали:

NB>>совсем не обязательно. ты книгу читал?


N>Да, сто лет назад вместе с книгой Александреску.


собственно, после прочтения у меня и сложилось мнение что основную часть Гуртовой написал.
Re: Value Semantics (CppCon 2022)
От: B0FEE664  
Дата: 10.01.23 11:54
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Интересно мнение коллег, кто что думает на эту тему?


Моё мнение: с этим докладом всё неверно, начиная от ошибочные архитектурно неверные решения исправляются неверными методами.
Пример на 7:07 class invariant
в классе две коллекции вектора xs и ys.
Проблема: нарушение инварианта при добавлении нового элемента в xs.
Далее автор утверждает, что это не проблема если данные приватны и начинает рассуждать о графе ссылок...

То, что эти данные приватные ничего не меняет, если вектора два, то должен существовать код обеспечивающий их инвариантность...
Фактически это архитектурно неверное решение, так как нам надо заниматься согласованием двух независимых объектов xs и ys. "заниматься согласованием" — это означает дополнительную работу, дополнительный код, который занимается согласованием, для обеспечения инвариантности. Но смотрите: если объединить x и y в одну структуру, то у нас останется один вектор xy для которого инвариантность соблюдается автоматически! И никакого дополнительного кода, никаких проверок не надо.

И далее всё так же...
И каждый день — без права на ошибку...
Re[2]: Value Semantics (CppCon 2022)
От: Videoman Россия https://hts.tv/
Дата: 10.01.23 13:22
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Пример на 7:07 class invariant


BFE>То, что эти данные приватные ничего не меняет, если вектора два, то должен существовать код обеспечивающий их инвариантность...

BFE>Фактически это архитектурно неверное решение, так как нам надо заниматься согласованием двух независимых объектов xs и ys.

Не понял с чем ты не согласен. Два вектора это данность, это просто пример двух классов членов другого класса, между которыми нужно поддерживать строго определённый набор состояний. Он просто таким образом иллюстрирует зачем нужен класс и что такое поддержка инварианта. Представь что ты не можешь их объединить, что это два независимых класса, какие-нибудь: gl::vector и dx::vector.

Если инвариант не нужен, то и класс не нужен. Достаточно структуры.

BFE>И далее всё так же...

Дальше всё совсем не об этом.
Отредактировано 10.01.2023 13:58 Videoman . Предыдущая версия .
Re[3]: Value Semantics (CppCon 2022)
От: B0FEE664  
Дата: 10.01.23 14:56
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Не понял с чем ты не согласен. Два вектора это данность, это просто пример двух классов членов другого класса, между которыми нужно поддерживать строго определённый набор состояний. Он просто таким образом иллюстрирует зачем нужен класс и что такое поддержка инварианта. Представь что ты не можешь их объединить, что это два независимых класса, какие-нибудь: gl::vector и dx::vector.

Ну, если у нас такая ситуация, то у нас проблема: ошибка проектирования. Но каким образом это относится к Value Semantics ?

V>Если инвариант не нужен, то и класс не нужен. Достаточно структуры.

BFE>>И далее всё так же...
V>Дальше всё совсем не об этом.
Не об этом, но в таком же стиле. Какие-то не связанные друг с другом задачи и не относящиеся к ним решения.
Там по делу наверное только про сортировку, но:
— то, что при наличии возможности перемещать объекты, объекты следует перемещать, а не передавать на них ссылки говорилось сразу после введения С++11.
— что будет с вектором, когда (на 35:44) при сортировке будет брошено исключение? Потеряем все данные?

К чему там всё остальное вообще не понятно. Если память не ресурс, то на каждое изменение копируем значение — это теория программирования первого курса университета.
И каждый день — без права на ошибку...
Re[4]: Value Semantics (CppCon 2022)
От: Videoman Россия https://hts.tv/
Дата: 10.01.23 15:12
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Ну, если у нас такая ситуация, то у нас проблема: ошибка проектирования. Но каким образом это относится к Value Semantics ?

Да что ты привязался к конкретике. Он просто объясняет что такое инвариант, зачем нужен класс и что по его мнению инварианты легко нарушить с reference semantics.

BFE>Там по делу наверное только про сортировку, но:

BFE>- что будет с вектором, когда (на 35:44) при сортировке будет брошено исключение? Потеряем все данные?
Не знаю что ты увидел на 35:44, не понятно, приведи пример

BFE>К чему там всё остальное вообще не понятно. Если память не ресурс, то на каждое изменение копируем значение — это теория программирования первого курса университета.

Тут фиг поспоришь. Функциональное программирование наше всё. Жалко что на практике память тоже нужна.
Re[4]: Value Semantics (CppCon 2022)
От: Sm0ke Россия ksi
Дата: 13.01.23 03:05
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>- что будет с вектором, когда (на 35:44) при сортировке будет брошено исключение? Потеряем все данные?


Тут вопрос где следует ловить исключение, когда sort принимает параметр как inout. Может быть в самой функции?

Или просто inout мувнет состояние объекта обратно, даже при исключении? Собственно процесс муванья желательно делать noexcept, скорее всего.
Re[7]: Value Semantics (CppCon 2022)
От: ути-пути Россия  
Дата: 28.01.23 07:26
Оценка:
Здравствуйте, night beast, Вы писали:

NB>то есть это его надо благодарить за то что коллекцию библиотек превратили в хренов монолит, вытащить что-то из которого тот еще геморрой?


А я так и не понял, зачем оттуда что-то вытаскивать. Место на диске экономить? Или какие-то религиозные заморочки?
Что не используешь — то не мешает. Зато установить можно разом, а не возиться из-за каждой новой понадобившейся фичи.

Есть, правда, еще лицензионные политики, но с ними вопросы не к бусту, а к тем, кто эти политики навязывает — у буста очень удобная лицензия для любого рода проектов.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: cref<> in<>
От: Sm0ke Россия ksi
Дата: 04.02.23 14:42
Оценка:
Я долго откладывал написание соображений на эту тему. В начале думал создать отдельный пост.
Я написал версию двух вспомогательных шаблонов cref<T> и in<T> , служащих для передачи параметров в функцию.
Как на ваш взгляд можно сделать лучше?

https://cpp.godbolt.org/z/ETjzoKhKj

cref<T> это простой алиас на const T &

in<T> мувает полученный параметр во внутреннее состояние с предоставлением доступа на запись/чтение.
Его нестатический метод move() нужен к примеру чтобы вернуть значение из функции.

Про inout<> и ref<> я напишу отдельно (скорее всего ответом на исходную тему).
std::array мувать смысла видимо нет, вот для него и ref<> сойдёт.

#include <utility>
#include <vector>
#include <iostream>

template <typename T>
using cref = const T &;

template <typename T>
struct in {
  using t_data = T;
  using t_read = const T &;
  using t_write = T &;
  using t_move = T &&;

  // data
  t_data    m_value;

  in(t_data && p) : m_value{std::move(p)} {}
  in(t_data & p) : m_value{std::move(p)} {}

  t_read read() const { return m_value; }
  t_write write() { return m_value; }
  t_move move() { return std::move(m_value); }

  // forbid
  in() = delete;
  in(cref<in>) = delete;
  in(in &&) = delete;
  in & operator = (cref<in>) = delete;
  in & operator = (in &&) = delete;
};

// testing

using t_vector = std::vector<int>;

void print(cref<t_vector> p, char name) {
  std::cout << name << ": ";
  if( p.empty() ) { std::cout << "empty vector\n"; }
  else {
    for( typename t_vector::const_reference it : p ) {
      std::cout << it << ' ';
    }
    std::cout << '\n';
  }
}

void test_in(in<t_vector> p) {
  std::cout << "test_in()\n";
  p.write().push_back(4);
  print(p.write(), 'p');
  std::cout << "test_in() end\n";
}

t_vector test_in_ret(in<t_vector> p) {
  std::cout << "test_in_ret()\n";
  return p.move();
}

int main() {
  std::cout << "# test 1\n";
  {
    t_vector v{1, 2, 3};
    print(v, 'v');
    test_in(v);
    print(v, 'v');
  }
  std::cout << "# test 2\n";
  {
    t_vector d{4, 5}, v;
    print(d, 'd'); print(v, 'v');
    v = test_in_ret(d);
    print(d, 'd'); print(v, 'v');
  }
  return 0;
}
Отредактировано 04.02.2023 14:51 Sm0ke . Предыдущая версия . Еще …
Отредактировано 04.02.2023 14:45 Sm0ke . Предыдущая версия .
Re[3]: cref<> in<>
От: Sm0ke Россия ksi
Дата: 04.02.23 19:55
Оценка:
Здравствуйте, rg45, Вы писали:

S>>
S>>template <typename T>
S>>using cref = const T &;
S>>


R>Тут проблемка есть: при таком определении, cref<T> — не всегда константная ссылка, например:


R>http://coliru.stacked-crooked.com/a/308af58edc86d8bc

R>
  Код примера
R>
R>#include <iostream>

R>template <typename T>
R>using cref = const T &;

R>template <typename T>
R>cref<T> make_cref(T&& t) { return cref<T>(t); }

R>void test(const int& i) { std::cout << "Non-mutable: " << i << std::endl; }

R>void test(int& i) { std::cout << "Mutable: " << ++i << std::endl; }

R>int main()
R>{
R>    int i = 42;

R>    test(make_cref(i)); // -> Mutable: 43
R>}
R>



Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.
А вы его возвращаете из return и используете не по назначению.

Это просто чтобы не писать const type & — а для наглядности. Но какой в этом тогда смысл?
Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке.
Например зачем char передавать по конст ссылке?
Отредактировано 04.02.2023 19:56 Sm0ke . Предыдущая версия .
Re[4]: cref<> in<>
От: rg45 СССР  
Дата: 04.02.23 21:23
Оценка:
Здравствуйте, Sm0ke, Вы писали:


S>Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.


1. Из чего следует, что cref нельзя использовать так, как показал я?
2. Что случится плогого, если доработать его таким образом, чтоб он гарантированно обеспечивал константную ссылку и соответствовал своему названию?

S>Это просто чтобы не писать const type & — а для наглядности. Но какой в этом тогда смысл?

S>Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке.
S>Например зачем char передавать по конст ссылке?

Ну то есть, он нужен только для того, чтоб мешать программистам объявлять типы формальных параметров функций так как им хочется. Офигенно полезная утилита
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.02.2023 21:42 rg45 . Предыдущая версия . Еще …
Отредактировано 04.02.2023 21:41 rg45 . Предыдущая версия .
Отредактировано 04.02.2023 21:23 rg45 . Предыдущая версия .
Re[4]: cref<> in<>
От: rg45 СССР  
Дата: 04.02.23 22:06
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.

S>А вы его возвращаете из return и используете не по назначению.

Ну, хорошо, можно и без make_cref, и без return. В таком примере все "по назначению"?

http://coliru.stacked-crooked.com/a/c4d021b1f60b8384

#include <iostream>

template <typename T>
using cref = const T &;

void process(cref<int>) { std::cout << "Constant" << std::endl; }
void process(int&) { std::cout << "Mutable" << std::endl; }

template <typename T>
void process_as_cref(T&& t) { process(cref<T>(t)); }

int main()
{
    int i = 42;

    process_as_cref(i);
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: cref<> in<>
От: rg45 СССР  
Дата: 04.02.23 22:18
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке.


После чего сразу же поломается возможность автоматического выведения типов при использовании этого cref для задания типов формальных параметров шаблонов функций.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 04.02.2023 22:19 rg45 . Предыдущая версия .
Re[5]: cref<> in<>
От: Sm0ke Россия ksi
Дата: 05.02.23 06:20
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Sm0ke, Вы писали:


S>>Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.

S>>А вы его возвращаете из return и используете не по назначению.

R>Ну, хорошо, можно и без make_cref, и без return. В таком примере все "по назначению"?


R>http://coliru.stacked-crooked.com/a/c4d021b1f60b8384


R>
R>#include <iostream>

R>template <typename T>
R>using cref = const T &;

R>void process(cref<int>) { std::cout << "Constant" << std::endl; }
R>void process(int&) { std::cout << "Mutable" << std::endl; }

R>template <typename T>
R>void process_as_cref(T&& t) { process(cref<T>(t)); }

R>int main()
R>{
R>    int i = 42;

R>    process_as_cref(i);
R>}
R>


Можно просто написать:
void process_as_cref(T&& t) { process(t); }
Re[3]: cref<> in<>
От: Sm0ke Россия ksi
Дата: 05.02.23 06:50
Оценка:
Здравствуйте, rg45, Вы писали:

R>Тут проблемка есть: при таком определении, cref<T> — не всегда константная ссылка, ...

http://coliru.stacked-crooked.com/a/f110a7aead6d4f5d
Спасибо, что нашли ошибку.

А что если определить так?
#include <type_traits>

template <typename T>
using cref = const std::remove_reference_t<T> &;
Re[4]: cref<> in<>
От: rg45 СССР  
Дата: 05.02.23 09:31
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>А что если определить так?

S>
S>#include <type_traits>

S>template <typename T>
S>using cref = const std::remove_reference_t<T> &;
S>


Можно так, можно чуть короче:

template <typename T>
using cref = const std::decay_t<T> &;


Но тогда возникает следующая проблема:

template <typename T>
void foo(cref<T>);

int main()
{
    foo(42); // error: couldn't deduce template parameter 'T'
}


А в целом выгоды от использования такого приспособления лично мне не очень понятны. По-моему, const T& проще и понятнее во всех случаях.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[6]: cref<> in<>
От: rg45 СССР  
Дата: 05.02.23 09:34
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Можно просто написать:

S>void process_as_cref(T&& t) { process(t); }

Так и я о том же — вреда от cref больше, чем пользы. Только лишний повод напрягаться при чтении кода.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Value Semantics (CppCon 2022)
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 12.02.23 11:54
Оценка:
Здравствуйте, Videoman, Вы писали:

V>- С++ отлично поддерживает value types, поэтому используйте эту возможность по максимуму, где это возможно и не будете иметь каскад описанных в докладе проблем.

А что, многие имели каскад описываемых проблем? Вот всю жизнь так делали и вот тебе на, оказывается проблемы на ровном месте.
V>- Reference types — тоже самое, что глобальные переменные, поэтому избегайте эту семантику как только можете.
Скоуп всё же меньше, не надо драматизировать и нагнетать. В рамках этого скоупа можно легко понять кто и что меняет.
V>А интересным он показался мне потому, что я, неосознанно, сам начал скатываться к тем же методам что используются в докладе, но не мог четко обосновать самому себе. Особенно актуально в свете массовой многопоточки и параллельности.
Это будет работать если обеспечить атомарность конструктора копирования или перемещения, тогда можно будет запускать несколько функций в разных потоках не беспокоясь о гонках, т.к. все они будут работать со своей копией данных.
Ещё коллега B0FEE664 задал корректный вопрос про исключение при move.
V>Интересно мнение коллег, кто что думает на эту тему?
Насмотрелись на иммутабельность в функциональных языках и тащат теперь везде. Я думаю проблема связана больше с конструкциями async/await в итоге, чем с тем что он приводил как "проблему".
Sic luceat lux!
Отредактировано 12.02.2023 12:00 Kernan . Предыдущая версия .
Re[2]: Value Semantics (CppCon 2022)
От: avovana Россия  
Дата: 15.02.23 13:53
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>То, что эти данные приватные ничего не меняет, если вектора два, то должен существовать код обеспечивающий их инвариантность...

BFE>Фактически это архитектурно неверное решение, так как нам надо заниматься согласованием двух независимых объектов xs и ys. "заниматься согласованием" — это означает дополнительную работу, дополнительный код, который занимается согласованием, для обеспечения инвариантности. Но смотрите: если объединить x и y в одну структуру, то у нас останется один вектор xy для которого инвариантность соблюдается автоматически! И никакого дополнительного кода, никаких проверок не надо.

BFE>И далее всё так же...


Т.е. поработали над 2мя типами структур, сделали 1у и теперь всё норм? Можно лишь 1 вектор. Звучит не плохо. Т.е. он же, к примеру, работал с тем что ему дали. И сказал почему это плохо. Может, мы можем провести аналогии и к нашему коду и сделать подобное улучшение, что он показал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.