@ProCxx

Страница 2469 из 2477
Vyacheslav
25.10.2018
12:16:18
Т.е. A& a_ref(guard_ptr a_guard) { a_guard_ = std::move(a_guard); return a; }
1.unique_ptr нельзя так передавать

Constantine
25.10.2018
12:16:29
Google
Vyacheslav
25.10.2018
12:17:23
Ну там move забыт
И && в параметре функции тогда уж

Matwey
25.10.2018
12:22:23
Смотрите какие я нашел стикеры

Ignat
25.10.2018
12:22:37
мм, свежачок

Igor
25.10.2018
12:24:14
с душой так, по-лебедевски

Constantine
25.10.2018
12:26:54
Давайте код целиком
примерно так //у нас есть апиха для работы с guard_ptr //guard_ptr make_guard(noexcept lambda) //есть вспомогательный тип ref_with_guard //по сути pair<A&, guard_ptr> только в одном указателе //неперемещаемый с одним слотом для простоты struct B { ref_with_guard<A> a_ref(guard_ptr a_guard) & { a_guard_ = std::move(a_guard); return { a, [this] () { a_guard_ = nullptr; } }; } private: A a; guard_ptr a_guard_; }; //пользователь В, неперемещаемый struct BUser { ref_with_guard<A> a; void init_with_b(B& b) { a = b.a_ref(make_guard([this] () { a = nullptr; })); } };

Vyacheslav
25.10.2018
12:30:53
вы ошибаетесь
Только через move.

Constantine
25.10.2018
12:31:05
Только через move.
Временный объект не требует move

Только через move.
std::unique_ptr<int> f() { return std::make_unique<int>(0); } void g(std::unique_ptr<int>) {} void foo() { g(f()); } //ok

Google
Constantine
25.10.2018
12:36:45
Так как же эту конструкцию использовать?
А тут все работает - класс BUser просто оповестят если В сдох. Что там делать остается вопрос к нему. Если вопрос debug проверок там становится чуть проще все это

Vyacheslav
25.10.2018
12:36:58
И что делает make_guard мне не понятно. Создаёт объект?

Constantine
25.10.2018
12:37:31
И что делает make_guard мне не понятно. Создаёт объект?
Создает unique_ptr на VirtuallyDestructible который выполнит параметр в деструкторе

Vyacheslav
25.10.2018
12:40:29
Constantine
25.10.2018
12:40:51
Всё равно не понятно, кто владеет А: guard_ptr или B.
А это поле класса В, им никто другой не может владеть

Vyacheslav
25.10.2018
12:40:53
Возврат из a_ref поясните пожалуйста

Туда передается референс на а, так?

Constantine
25.10.2018
12:41:42
Возвращается пара из ссылки на А и действия по "мне больше не нужна ссылка"

Если предполагается debug проверка в конце типа "assert все хорошо" можно просто тот самый refcount на себя считать

Vyacheslav
25.10.2018
12:46:45
Я пока пытаюсь весь код понять. a = nullptr сбивает с толку в последнем методе. Я так понимаю, привэсваиыается пустой ref_with_guard, что в момент разрушения BUser не имеет большого смысла

Т.е. разделить доступ к А без проброски BUser во все использующие А методы не удастся.

Или же везде гонять ref_with_guard<A>, что мало чем отличается от, например, const shared_ptr<A>&

Жёсткое ограничение, что ссылкой на А владеет только один BUser, никуда не уходит.

То, что сброс в nullptr user2.a произойдёт раньше времени уничтожения B.a вопросов не вызывает. Нюанс заключается в том, что в деструкторе A нет возможности обратиться к объемлющему классу B, т.к. он на тот момент уже разрушен. В моём примере такая возможность есть.

Nikita
25.10.2018
13:54:23
Всем ку cppreference про std::array::front, в частности, говорит: Calling front on an empty container is undefined. Допускается ли реализация, которая вызывает ошибку компиляции?

или код должен компилиться

Nikita
25.10.2018
13:56:06
WAID WUT?
Что-то неясно?)

Евгений
25.10.2018
13:56:47
Sore, bur ju juzz said some DEACH.

Google
Евгений
25.10.2018
13:57:54
Что-то неясно?)
let's projdyomte's гражданин: https://t.me/supapro

Xessao
25.10.2018
13:58:22
Всем привет, кто-нибудь пользуются PVS-Studio?

Nikita
25.10.2018
13:58:39
Alexander
25.10.2018
13:58:47
Всем ку cppreference про std::array::front, в частности, говорит: Calling front on an empty container is undefined. Допускается ли реализация, которая вызывает ошибку компиляции?
но это легко обходится - делается варнинг на это и пишется -Werror (если компилятор может доказать, что ты творишь дичь)

Xessao
25.10.2018
13:59:05
я
Можешь скинуть любой html отчёт? Нужно сделать одноразовый отчёт и хочу взять за базу их версию.

Nikita
25.10.2018
14:00:13
но это легко обходится - делается варнинг на это и пишется -Werror (если компилятор может доказать, что ты творишь дичь)
я сейчас не пользователь, а по другую сторону баррикад - хочу naive implementation подвезти, совместимый с C++03 (а то интерфейс некоторых функций без array дико корявый выходит)

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

Alexen
25.10.2018
14:01:36
У гцц посмотри

Там есть специализация для пустого

Nikita
25.10.2018
14:03:46
У гцц посмотри
угу, можно)

{ return *static_cast<_Tp*>(nullptr); } каеф блин

Nikita
25.10.2018
14:08:12
у Microsoft array<T, 0> содержит массив единичной длины
прикольно т.е. если T не default-constructible, то будет ошибка при инстанцировании такого массива?

Ilia
25.10.2018
14:10:08
Nikita
25.10.2018
14:10:44
А ты будешь объявлять массив не default constructible типов?
да я вряд ли вообще буду пустой объявлять, но у меня то наивная реализация, а вот микрософт в другом положении

Andrey
25.10.2018
14:11:26
А кто-нибудь разбирался с "Core Coroutines" http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1063r1.pdf ?
Я пробежался глазами, выводы которые сделал для себя: 1. стало сильно лучше по сравнению с первой ревизией — убрали безумные 2 return type функции 2. по-прежнему слишком сложно 3. шикарная часть "Alternative: Patching the TS", особенно мне понравилась идея определять is_resumable.

Google
Constantine
25.10.2018
14:12:05
Жёсткое ограничение, что ссылкой на А владеет только один BUser, никуда не уходит.
Там тогда по-другому немного надо писать, это пример с одним

Nikita
25.10.2018
14:13:24
а почему это должно отличаться от основного случая size != 0?
ну вроде бы не пустой array всегда можно проинициализировать кастомными значениями

Vyacheslav
25.10.2018
14:13:53
Nikita
25.10.2018
14:14:00
std::array<Foo, 3> myArr = { Foo(1), Foo(2), Foo(3) };

Vyacheslav
25.10.2018
14:17:10
О! Точно, там надо явный деструктор писать для BUser
А как его можно написать, если порядок создания-разрушения может быть сколь угодно вложенным?

Andrey
25.10.2018
14:17:19
ну вроде бы не пустой array всегда можно проинициализировать кастомными значениями
как ни странно у Microsoft пустой array тоже можно проинициализировать кастомным значением :)) std::array<Foo, 0> myArr { Foo(1) };

Constantine
25.10.2018
14:18:58
@webreh ^ вот здесь обратное поведение.
Это так не сработает. Вы не можете обращаться полноценно к В из деструктора А в вашем примере. Попытка использовать любой метод, требующий А, в деструкторе класса А приведет к UB (бесконечный цикл без side effect), которое будет зависанием из-за того, что компилятор не оптимизирует через аллокацию памяти

Constantine
25.10.2018
14:21:11
Согласен, но уведомить любым образом B о том, что объект A разрушился, можно.
В моем примере я умею уведомлять В о том, что А разрушился, вообще без проблем

Constantine
25.10.2018
14:22:31
@webreh каким образом, если вот эта штука ^ не работает?
Там если надо несколько копий придется чуть больше кодить

@webreh каким образом, если вот эта штука ^ не работает?
guard_ptr заменится на что-то, что умеет хранить и искать чуть более одного

Vyacheslav
25.10.2018
14:24:22
Там если надо несколько копий придется чуть больше кодить
Только зваться деструктивор ref_with_guard будет *после* деструктора B

Google
Александр
25.10.2018
14:25:50
нет, не допускается
Почему не допускается? UB на то и UB, что может приводить к чему угодно

Constantine
25.10.2018
14:28:56
Только зваться деструктивор ref_with_guard будет *после* деструктора B
Да, но если деструктор В вызвался, он первым делом занулит a_guard_ который занулит ref_with_guard, так что деструктор будет с nullptr Там нужно явно прописывать присваивание в nullptr в деструкторе или использовать исправленный unique_ptr но это тонкости

Constantine
25.10.2018
14:30:25
Vyacheslav
25.10.2018
14:30:47
Constantine
25.10.2018
14:30:57
Для этого их все нужно держать в голове :)
Нет, просто объявления нужно группировать

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

Vyacheslav
25.10.2018
14:32:16
Мне дубли такого рода сложно воспринимать. Уже привык, что 1 нетривиальная переменная = 1 сущность.

Constantine
25.10.2018
14:32:57
Vyacheslav
25.10.2018
14:33:45
Я думаю, пора тему закрывать. И тот, и тот подход имеет право на жизнь. Ваш мне сложнее для запоминания.

Kitsu
25.10.2018
14:34:18
А есть какие-нибудь особенности с class template instantiation у boost::variant? Все вроде как работало, затем разнес в header/cpp-impl в виде extern template class/template class и компилятор (clang 8) стал ругаться на invalid operands to binary expression (const T, const T)

Constantine
25.10.2018
14:34:45
В общем из языков, которые не имеют императивов времени жизни

Vyacheslav
25.10.2018
14:36:07
Тут проблема, что ваш это подход, видимо, привнесенный из Java/C#
Скорее из Windows COM и Delphi, с которого я начинал. :) Ну и много лямбд выносят мозг: вроде код написан рядом, а выполняется совсем в другой момент

Страница 2469 из 2477