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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: std::map<..., unique_ptr> инициализация  (Прочитано 21493 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Февраль 02, 2017, 10:04 »

Привет, друзья!
Прошу помочь разобраться, почему следующий код не верен.
Код
C++ (Qt)
#include <iostream>
#include <memory>
#include <map>
 
using namespace std;
 
class A{
public:
   A(){}
   A(const A &) = delete;
   A(A&&) = default;
   A &operator = (const A &) = delete;
   A &operator = (A&&) = default;
};
 
int main()
{
   std::map<int, unique_ptr<A>> map ={
       {1, make_unique<A>()}
   };
}
 
По идеи в правой части список инициализации с xvalue. Почему компиляторы требуют от меня реализации копирования?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Февраль 02, 2017, 11:53 »

Наверное потому, что помещение в std::map - это копирование?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #2 : Февраль 02, 2017, 13:41 »

Конструкторы std::map.

Конструктор (5):
Цитировать
(5) initializer list constructor
    Constructs a container with a copy of each of the elements in il.
Записан

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

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Февраль 02, 2017, 14:09 »

Конструкторы std::map.

Конструктор (5):
Цитировать
(5) initializer list constructor
    Constructs a container with a copy of each of the elements in il.
Туда-то я как-то и не догадался первым делом посмотреть. Спасибо.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #4 : Февраль 02, 2017, 15:24 »

Ради интереса потом можете попробовать засунуть unique_ptr<A> в QMap Подмигивающий.
Записан

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

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Февраль 02, 2017, 16:23 »

Не, всё та же проблема с копированием unique_ptr
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Февраль 02, 2017, 16:25 »

Подглядел где-то, что shared_ptr подойдёт для моих нужд.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Февраль 02, 2017, 16:29 »

Кстати, быть может это будет и правильнее с точки зрения проектирования. Ведь мне необходимо в некоторых методах возвращать указатель на объект, так пусть он и будет завёрнут в shared_ptr.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #8 : Февраль 02, 2017, 17:02 »

Ведь мне необходимо в некоторых методах возвращать указатель на объект, так пусть он и будет завёрнут в shared_ptr.

Это плохая идея - возвращать голый указатель на объект под управлением умного указателя. Нужно стараться обходиться unique_ptr, shared_ptr, weak_ptr и ссылками на объект.
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 02, 2017, 17:20 »

Допустим желанная мапа <int, unique_ptr> создана. Как она должна работать7
Код:
auto val = theMap.value(1);  // и после этого мапа хранит пустой указатель по ключу 1
Смысл?

Кстати, быть может это будет и правильнее с точки зрения проектирования. Ведь мне необходимо в некоторых методах возвращать указатель на объект, так пусть он и будет завёрнут в shared_ptr.
Это часто хорошо, но не всегда, во всяком случае это действие не безобидно
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #10 : Февраль 02, 2017, 23:21 »

Допустим желанная мапа <int, unique_ptr> создана. Как она должна работать7
Код:
auto val = theMap.value(1);  // и после этого мапа хранит пустой указатель по ключу 1
Смысл?

У std::map нет метода value.
operator[] и at() возвращают ссылку.
Вы вот так хвалитесь незнанием букваря, а лучше бы поучили стандартную библиотеку, там многое сделано очень грамотно и обоснованно для кучи разных юзкейзов (скорость, exception-safety и тп)
« Последнее редактирование: Февраль 02, 2017, 23:35 от Авварон » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #11 : Февраль 02, 2017, 23:40 »

Ради интереса потом можете попробовать засунуть unique_ptr<A> в QMap Подмигивающий.

Забавно, что корни этой проблемы лежат не в лени кутешников, а в... фанфары... copy-on-write.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #12 : Февраль 03, 2017, 13:36 »

Забавно, что корни этой проблемы лежат не в лени кутешников, а в... фанфары... copy-on-write.

Точно Улыбающийся. Ещё стоит отметить любовь кутешников к смешиванию нескольких функциональностей/техник в одном флаконе, без возможности выбора. Implicit Sharing в контейнерах штука может и полезная, но, как выясняется, не всегда. Такие контейнеры не могут хранить уникальные объекты, что сужает область их применения.
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Февраль 03, 2017, 14:30 »

У std::map нет метода value.
operator[] и at() возвращают ссылку.
И что, получив такую ссылку я должен все время следить не скопирована ли она?

Такие контейнеры не могут хранить уникальные объекты, что сужает область их применения.
А что (какой ф-ционал) хотелось получить? И что здесь понимается под уникальностью? Только один владеет? (unique_ptr). Тогда зачем помещать его в контейнер - ведь это подразумевает обращение к этому контейнеру.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #14 : Февраль 03, 2017, 14:42 »

А что (какой ф-ционал) хотелось получить? И что здесь понимается под уникальностью? Только один владеет? (unique_ptr). Тогда зачем помещать его в контейнер - ведь это подразумевает обращение к этому контейнеру.

А зачем вообще нужен unique_ptr? Функционал такой же, как при использовании unique_ptr, только с возможностью хранить несколько объектов, а не один.
Записан

Пока сам не сделаешь...
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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