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

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

Страниц: 1 ... 4 5 [6] 7 8 9   Вниз
  Печать  
Автор Тема: C++ Object Token Library  (Прочитано 52331 раз)
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #75 : Февраль 11, 2020, 08:47 »

Ух! Стоило отвлечся и понаписали))).
Внесу свой вклад в обсуждение (чтобы еще больше всех запутать).

Объектно-ориентированная модель является первичной по отношению к объектно ориентированной программе.
При этом одну и ту же модель можно реализовать совершенно разными способами.



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

1. Простейший способ реализации

Код
C++ (Qt)
struct Owner
{
   Resource m_resource;
};
 

Распределение ресурса по месту владельца.
Нельзя извлечь ресурс и сломать ассоциативные связи с ним.
Гарантированное отношение 1 владелец - 1 ресурс.
Потоко небезопасный доступ к ресурсу.

Код
C++ (Qt)
struct User
{
   Resource & m_resource;
};
 

Неизменяемая ассоциация с ресурсом.
Отсутствие контроля корректности ассоциативной связи с ресурсом.
Гарантированное отношение много пользователей - 1 ресурс.
Потоко небезопасный доступ к ресурсу.

Возможен такой вариант

Код
C++ (Qt)
struct User
{
   ::std::reference_wrapper< Resource > m_resource;
};
 

Изменяемая ассоциация с ресурсом.
Отсутствие контроля корректности ассоциативной связи с ресурсом.
Гарантированное отношение много пользователей - 1 ресурс.
Потоко небезопасный доступ к ресурсу.

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

Код
C++ (Qt)
struct Owner
{
   Resource * m_resource = nullptr;
 
   Owner () : m_resource( new Resource ) {}
   ~Owner () { delete m_resource; }
   Owner ( Owner && other ) { ::std::swap( m_resource, other.m_resource ); }
   Owner ( const Owner & other ) : m_resource( new Resource( *other.m_resource ) ) {}
};
 

Распределение ресурса в куче.
Можно сломать ассоциативные связи с ресурсом.
Контроль отношения 1 владелец - 1 ресурс лежит на программисте.
Потоко небезопасный доступ к ресурсу.

Код
C++ (Qt)
struct User
{
   Resource * m_resource;
   User ( Resource & resource ) : m_resource( ::std::addressof( resource ) );
};
 

Изменяемая ассоциация с ресурсом.
Отсутствие контроля доступа к ресурсу.
Контроль отношения много пользователей - 1 ресурс лежит на программисте.
Потоко небезопасный доступ к ресурсу.

3. Реализация через unique_ptr

Код
C++ (Qt)
struct Owner
{
   ::std::unique_ptr< Resource > m_resource;
 
   Owner () : m_resource( ::std::make_unique< Resource >() ) {}
   Owner ( const Owner & other ) : m_resource( ::std::make_unique< Resource >( *other.m_resource ) ) {}
};
 

Распределение ресурса в куче.
Можно сломать ассоциативные связи с ресурсом.
Контроль отношения 1 владелец - 1 ресурс лежит на программисте.
Потоко небезопасный доступ к ресурсу.

Подойдет любая реализация User из вариатнов выше.

4. Реализация через shared_ptr

Код
C++ (Qt)
struct Owner
{
   ::std::shared_ptr< Resource > m_resource;
 
   Owner () : shared_ptr( ::std::make_shared< Resource >() ) {}
   Owner ( Owner && other ) { ::std::swap( m_resource, other.m_resource ); }
   Owner ( const Owner & other ) : m_resource( ::std::make_unique< Resource >( *other.m_resource ) ) {}
};
 

Распределение ресурса в куче.
Можно сломать ассоциативные связи с ресурсом.
Контроль отношения 1 владелец - 1 ресурс лежит на программисте.
Потоко небезопасный доступ к ресурсу.

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

Кроме реализация User из вариатнов выше, может быть такая

Код
C++ (Qt)
struct User
{
   ::std::weak_ptr< Resource > m_resource;
   User ( ::std::shared_ptr< Resource > resource ) : m_resource( resource );
};
 

Изменяемая ассоциация с ресурсом.
Наличие контроля доступа к ресурсу.
Контроль отношения много пользователей - 1 ресурс лежит на программисте.
Потоко небезопасный доступ к ресурсу.

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

Контроль доступа к ресурсу может осуществлен и другими способами, не только связкой shared/weak, например, с помощью mutex, или учетом всех ассоциаций, или совместным владением raw указателя на ресурс, или др. При этом можно контролировать и другие свойства, такие как потоко безопасность, ленивые вычисления и т.п.


Всё что понаписано выше - это примеры того, как одна и та же модель реализуется с помощью разных примитивов языка C++ и библиотеки std. Для контроля разных дополнительных свойств, необходимых в конкретной программе, этих примитивов не достаточно, и требуется дополнительный контроль корректности использования ассоциативных связей со стороны программиста.

C++ Object Token Library предоставляет примитивы, которые контроль корректности использования ассоциативных связей, перекладывают на компилятор. Некий синтаксический сахар, чтобы случайно не выстрелить себе в ногу).

Для тех, кто не готов отдать контроль корректности использования ассоциативных связей компилятору, эта библиотека не нужна.
« Последнее редактирование: Февраль 11, 2020, 16:48 от ssoft » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #76 : Февраль 11, 2020, 09:32 »

Статический мьютекс это прекрасно =)
Могли бы указать на содержательные ошибки (напр в Engine::~Engine). Одни финтифлюшки на уме.

Что ж... пусть это будет третий вариант. Может кто-то возьмёт его на вооружение Улыбающийся.
Не видел ни первого ни второго  Улыбающийся

Согласно UML диаграмме, у Engine нет ссылок/указателей на Car и Monitor. Такие дела.
Значит неверна диаграмма. Engine должна знать куда она вмонтирована. Иначе потом не протолкнуться

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

1) Чтобы получить это "получше" придется объявлять/создавать указатель на Engine чем-то "эдаким" (так или иначе а счетчик ссылок куда-то воткнуть надо). А дальше посыпется все по цепочке домино - ВСЕ указатели должны быть Ваши, потенциальный юзер должен ВСЕЦЕЛО принять Вашу идеологию указателей/токенов. Такое предложение просто неприлично (это еще очень мягко говоря).

2) Хорошо, допустим Ваша концепция даже принята, что несчастная жертва с этого имеет? Богатый набор указателей с человеческой валидностью (что по-хорошему должно быть в std). Согласен. Что еще? Да НИЧЕГО. Как только абстрактный пример Car-Engine-Monitor станет реальным - придется обеспечивать и копирование, и синхронизацию - то что я написал. И разве Ваша либа в этом как-то поможет? Не вижу как. Тогда "за что боролись"? Где "выйгрышь"?

Есть ли другие способы? Думаю что есть. См напр Engine::mMonitors и Monitor::Engine. Эти голые указатели изрядно засоряют рабочие классы. Как избавиться от них, при этом сохранив public методы типа AddMonitor? По-моему это неплохо обобщается, и, не менее важно, не накладывает на юзверя никаких обязательств. Но... Вы ведь это слушать все равно не будете, да и "пиар своего детища" в мои планы не входит  Улыбающийся




Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #77 : Февраль 11, 2020, 10:09 »

Что ж... пусть это будет третий вариант. Может кто-то возьмёт его на вооружение Улыбающийся.
Не видел ни первого ни второго  Улыбающийся

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

Согласно UML диаграмме, у Engine нет ссылок/указателей на Car и Monitor. Такие дела.
Значит неверна диаграмма. ...

Точнее и не скажешь Веселый.

С Вашей либой я знаком очень поверхностно, поэтому поправьте если дальше не так. Как я понял, задумка в том чтобы вместо голого Monitor::mEngine иметь нечто получше, что хотя бы обеспечит валидность этого указателя (теперь уж наверно "токена"). Тут 2 момента

1) Чтобы получить это "получше" придется объявлять/создавать указатель на Engine чем-то "эдаким" (так или иначе а счетчик ссылок куда-то воткнуть надо). А дальше посыпется все по цепочке домино - ВСЕ указатели должны быть Ваши, потенциальный юзер должен ВСЕЦЕЛО принять Вашу идеологию указателей/токенов. Такое предложение просто неприлично (это еще очень мягко говоря).

2) Хорошо, допустим Ваша концепция даже принята, что несчастная жертва с этого имеет? Богатый набор указателей с человеческой валидностью (что по-хорошему должно быть в std). Согласен. Что еще? Да НИЧЕГО. Как только абстрактный пример Car-Engine-Monitor станет реальным - придется обеспечивать и копирование, и синхронизацию - то что я написал. И разве Ваша либа в этом как-то поможет? Не вижу как. Тогда "за что боролись"? Где "выйгрышь"?

Есть ли другие способы? Думаю что есть. См напр Engine::mMonitors и Monitor::Engine. Эти голые указатели изрядно засоряют рабочие классы. Как избавиться от них, при этом сохранив public методы типа AddMonitor? По-моему это неплохо обобщается, и, не менее важно, не накладывает на юзверя никаких обязательств. Но... Вы ведь это слушать все равно не будете, да и "пиар своего детища" в мои планы не входит  Улыбающийся

Я же выше уже говорил, моё дело предложить Улыбающийся. А дальше пусть каждый для себя выбирает, какой вариант ему больше подходит. Благо их количество постепенно увеличивается и есть из чего выбирать Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #78 : Февраль 11, 2020, 10:35 »

Ну первый увидеть немудрено,
На странице "UML" есть ссылка "Examples", тыкал туда, но кода не увидел. Это опять надо лазить (не стал), и это (ненужно) напрягает. Как-то у Вас с саморекламой плоховато.

Я же выше уже говорил, моё дело предложить
Согласен, имеете право

Тут мелькнул интересный момент, но, как всегда, растворился в дальнейшей перебранке типа "ага/угу". Утверждалось (неоднократно) что "юник" один - и только один, поэтому, дескать, никакое продление жизни для него невозможно, т.к. он немедленно станет shared, а так низзя

Вот пример из букваря
Код
C++ (Qt)
static void doDeleteLater(MyObject *obj)
{
   obj->deleteLater();
}
 
Ну а если не deleteLater а напр какой-нибудь push_back который создаст из raw указателя shared? Как видим, Qt/std против этого совсем не возражают. Да, юник один, и он отстрелялся (его delete свершилось). Но убивать сами данные никто не заставляет.
Да
Цитировать
Была докторская - стала любительская
Требуется просто "не обе вместе/одновременно". А для пресловутого продления и shared не требуется
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #79 : Февраль 11, 2020, 10:36 »

C++ Object Token Library предоставляет примитивы, которые контроль корректности использования ассоциативных связей, перекладывают на компилятор. Некий синтаксический сахар, чтобы случайно не выстрелить себе в ногу).

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

Именно так. Сейчас токены - это обёртки над голыми указателями и умными указателями из std (внутри которых всё равно голые указатели). Можно только на этих голых указателях писать, Igors пример привёл Улыбающийся. Можно на Си писать, можно на ассемблере. Вопрос в усилиях, которые должен приложить разработчик, удобстве выражения мыслей, наглядности, корректности и безопасности кода.

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

Ещё попытался внести порядок в терминологию и классификацию. А то все говорят "владение", "владелец", "шаред" и т.п., но кто даст точные определения этим терминам, тому буду благодарен Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #80 : Февраль 11, 2020, 10:49 »

Можно только на этих голых указателях писать, Igors пример привёл Улыбающийся. Можно на Си писать, можно на ассемблере. Вопрос в усилиях, которые должен приложить разработчик, удобстве выражения мыслей, наглядности, корректности и безопасности кода.
Я бы это сформулировал иначе

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

И, на мой взгляд, тут баланс явно не в Вашу пользу
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #81 : Февраль 11, 2020, 11:06 »

На странице "UML" есть ссылка "Examples", тыкал туда, но кода не увидел. Это опять надо лазить (не стал), и это (ненужно) напрягает. Как-то у Вас с саморекламой плоховато.

Да, претензия принимается. Для старой библиотеки скрыл некоторые репозитории, ссылки побились, что внесло некоторую неопределённость. Страница с UML находится в репозитории Example/Car, её путь отображается в верхней части страницы. Соответственно, код здесь.

Тот же пример в актуальной библиотеке: Car.

Можно только на этих голых указателях писать, Igors пример привёл Улыбающийся. Можно на Си писать, можно на ассемблере. Вопрос в усилиях, которые должен приложить разработчик, удобстве выражения мыслей, наглядности, корректности и безопасности кода.
Я бы это сформулировал иначе

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

И, на мой взгляд, тут баланс явно не в Вашу пользу

С этим я спорить абсолютно не буду, в Вашем случае всё именно так, как Вы описали Улыбающийся.
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #82 : Февраль 11, 2020, 12:35 »

Ух! Стоило отвлечся и понаписали))).
Внесу свой вклад в обсуждение (чтобы еще больше всех запутать).

Объектно-ориентированная модель является первичной по отношению к объектно ориентированной программе.
При этом одну и ту же модель можно реализовать совершенно разными способами.
...

Отличный разбор полётов Улыбающийся.

Выше уже писал, что в случае с inplace (по месту владельца) смущают ситуации со сменой/перемещением ресурса. В случае с кучей, User связан с "отдельным ресурсом", в случае inplace, User связан с "ресурсом, который связан с Owner", как-то это не consistent Улыбающийся. Как бы тут гармонию навести?

Пример:
Код
C++ (Qt)
#include <memory>
#include <string>
#include <iostream>
 
using namespace std;
 
template <class T>
using heap_unique = unique_ptr<T>;
 
template <class T>
using inplace_unique = T;
 
template <class T>
using weak = T *;
 
using Resource = string;
 
int main()
{
   cout << "----- heap -----" << endl;
   heap_unique<Resource> heap_owner_1 = make_unique<Resource>("heap_resource_1");
   weak<Resource>        heap_weak{heap_owner_1.get()};
   cout << "heap_owner_1: " << *heap_owner_1 << endl;
   cout << "heap_weak   : " << *heap_weak << endl;
   cout << "moving..." << endl;
   heap_unique<Resource> heap_owner_2 = std::move(heap_owner_1);
   heap_owner_1 = make_unique<Resource>("heap_resource_2");
   cout << "heap_owner_1: " << *heap_owner_1 << endl;
   cout << "heap_owner_2: " << *heap_owner_2 << endl;
   cout << "heap_weak   : " << *heap_weak << endl;
   cout << endl;
 
   cout << "----- inplace -----" << endl;
   inplace_unique<Resource> inplace_owner_1 = "inplace_resource_1";
   weak<Resource> inplace_weak{&inplace_owner_1};
   cout << "inplace_owner_1: " << inplace_owner_1 << endl;
   cout << "inplace_weak   : " << *inplace_weak << endl;
   cout << "moving..." << endl;
   inplace_unique<Resource> inplace_owner_2 = std::move(inplace_owner_1);
   inplace_owner_1 = "inplace_resource_2";
   cout << "inplace_owner_1: " << inplace_owner_1 << endl;
   cout << "inplace_owner_2: " << inplace_owner_2 << endl;
   cout << "inplace_weak   : " << *inplace_weak << endl;
   cout << endl;
}

Вывод:
Код:
----- heap -----
heap_owner_1: heap_resource_1
heap_weak   : heap_resource_1
moving...
heap_owner_1: heap_resource_2
heap_owner_2: heap_resource_1
heap_weak   : heap_resource_1

----- inplace -----
inplace_owner_1: inplace_resource_1
inplace_weak   : inplace_resource_1
moving...
inplace_owner_1: inplace_resource_2
inplace_owner_2: inplace_resource_1
inplace_weak   : inplace_resource_2
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #83 : Февраль 11, 2020, 12:41 »

Тут мелькнул интересный момент, но, как всегда, растворился в дальнейшей перебранке типа "ага/угу". Утверждалось (неоднократно) что "юник" один - и только один, поэтому, дескать, никакое продление жизни для него невозможно, т.к. он немедленно станет shared, а так низзя

Вот пример из букваря
Код
C++ (Qt)
static void doDeleteLater(MyObject *obj)
{
   obj->deleteLater();
}
 
Ну а если не deleteLater а напр какой-нибудь push_back который создаст из raw указателя shared? Как видим, Qt/std против этого совсем не возражают. Да, юник один, и он отстрелялся (его delete свершилось). Но убивать сами данные никто не заставляет.
Да
Цитировать
Была докторская - стала любительская
Требуется просто "не обе вместе/одновременно". А для пресловутого продления и shared не требуется

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

Пока сам не сделаешь...
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #84 : Февраль 11, 2020, 16:58 »

... Как бы тут гармонию навести? ...

По сути после операции move над значением, для ассоциации weak реализуется UB. То что weak без контроля доступа вообще на что-то ссылается - это скорее баг, чем фитча.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #85 : Февраль 11, 2020, 18:15 »

Вот пример из букваря
Код
C++ (Qt)
static void doDeleteLater(MyObject *obj)
{
   obj->deleteLater();
}
 

Возможно, в Qt6 не будет мембера deleteLater а будет
Код:
template<class T>
static void doDeleteLater(std::unique_ptr<T> obj) { /*some metaobject magic*/ }
Но это пока гадание на кофейной гуще.

Цитировать
Ну а если не deleteLater а напр какой-нибудь push_back который создаст из raw указателя shared? Как видим, Qt/std против этого совсем не возражают. Да, юник один, и он отстрелялся (его delete свершилось). Но убивать сами данные никто не заставляет.
Вот ИМЕННО ПОЭТОМУ нельзя использовать голые указатели. "А что если я выстрелю себе в ногу, ваши вумные указатели тут не помогут". Тут либо трусы, либо крестик - либо вы забыли про слова new/delete, либо делаете все на голых указателях (и страдаете).
А shared_ptr имеет конструктор от unique_ptr и просто "расшаривает" оный.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #86 : Февраль 11, 2020, 19:04 »

Тогда в конструкторе SomeCar (даже когда он в cpp файле находится) должен быть доступен конкретный тип SomeEngine.

да.
именно так оно и должно быть.

а вот ситуация, когда ты хочешь подсунуть фиг-знает-что,
вот это уже нежелательное осложнение.

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

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

Такая зависимость может быть нежелательна или невозможна.

приведи реальный пример для начала.

я за свою карьеру понял одну вещь:
либо у человека есть веская причина, почему он использовал фабрику (и тп выпендрёж)
либо он просто болен ООП головного мозга.






Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #87 : Февраль 12, 2020, 09:48 »

По сути после операции move над значением, для ассоциации weak реализуется UB. То что weak без контроля доступа вообще на что-то ссылается - это скорее баг, чем фитча.

Вообще, такой же фокус можно и с heap_unique провернуть: std::move(*heap_owner_1) и тоже фигня получится. Ладно, это тема отдельного разговора.

А вообще нужна обёртка-токен над объектом-по-месту? Есть варианты использования, когда без неё тяжко?
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #88 : Февраль 12, 2020, 09:51 »

я за свою карьеру понял одну вещь:
либо у человека есть веская причина, почему он использовал фабрику (и тп выпендрёж)
либо он просто болен ООП головного мозга.

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

"Talk is cheap, show me the code." (c). Постановка задачи выше.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #89 : Февраль 12, 2020, 10:42 »

Выше уже писал, что в случае с inplace (по месту владельца) смущают ситуации со сменой/перемещением ресурса. В случае с кучей, User связан с "отдельным ресурсом", в случае inplace, User связан с "ресурсом, который связан с Owner", как-то это не consistent Улыбающийся. Как бы тут гармонию навести?
Давайте я позадаю наивные (или даже лоховские) вопросы, это неплохой тест насколько интуитивна либа
Код
C++ (Qt)
   heap_unique<Resource> heap_owner_1 = make_unique<Resource>("heap_resource_1");
   weak<Resource>        heap_weak{heap_owner_1.get()};
   ...
   heap_unique<Resource> heap_owner_2 = std::move(heap_owner_1);
   heap_owner_1 = make_unique<Resource>("heap_resource_2");
 
Выходит безымянный юник созданный make_unique убился, но heap_unique перехватил данные (строку). А если так
Код:
auto temp = make_unique<Resource>("heap_resource_1");
heap_unique<Resource> heap_owner_1 = temp;
Так должно быть нельзя (юник один). Наверно используется какой-то хитрый конструктор &&. Ну ладно. Следующая строка (weak) вопросов не вызывает. Но вот потом.. какой рез-т ожидается от move? Что перемещаем, данные или только "оболочку"? Вроде данные, и ...weak автоматом ссылается на новый адрес(?). Не знаю насколько верны мои предположения, но во всяком случае

- плохо уже то что это не интуитивно и вызывает (ненужные) вопросы

- клиент (пользующий weak) может рассчитывать на неизменность адреса и рухнуть при его смене

- да, и интересно узнать какие резоны (или необходимость) в разделении на heap_unique и
inplace_unique? Пока не уловил в чем их половая разница

Включать "стандартную лексику" (типа "читай доку" и.т.п.) не стоит, она справедлива уже после того как решение использовать либу принято. А до того "симпатично или как"  Улыбающийся
Записан
Страниц: 1 ... 4 5 [6] 7 8 9   Вверх
  Печать  
 
Перейти в:  


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