туда новый вектор, который заранее сформировал, я правильно понимаю, что если я сделаю вот так:
storage.insert(std::move(new_line));
то вызовется мув конструктор и у меня хорошо все переложится из вектора( а сам он станет пустым) ?
Используй emplace
Хммм, а emplace вызовет мув конструктор у нового вектора, который собирается внутри сета?
Нет, не вызовет, он не нужен вообще при emplace
Я правда не помню есть ли emplace в set-ах, но должно быть по идееи..
При emplace объект конструируется по месту , уже в контейнере, за счёт perfect forwarding
Так у него не аргументы для конструктора а готовый обьект
Возможность emplace должна поддерживаться компилятором или она реализуется через r-value и NVRO?
emplace это функция в стандартной библиотеке
Нет, должны быть аргументы конструктора
Это понятно. Но чтобы сконструировать объект "на месте" компилятор же должен что-то уметь? У меня в стандартной библиотеке у класса list, например, нет метода emplace. Но компилятор поддерживает r-value и NRVO. Почему же нет emplace?
Так у него другой вектор, а не аргументы для вектора
Потому что стандарт не полностью поддерживается
А могу я создать наследника std::list, в котором добавлю emplace?
Ты не сможешь его реализовать
Потому что компилятор чего-то "не умеет", да?
Нет, потому что emplace не выражается через открытый интерфейс
Как вообще связаны nrvo и emplace?
Ну у тебя нет доступа к полям
perfect forwarding он должен уметь, 11ый стандарт.
Они по эффекту похожи. Оба переносят конструирование в конечный целевой объект на том месте, где он должен финально оказаться.
тем не менее nrvo это компиляторная оптимизация, а emplace просто функция
Обсуждают сегодня