Посмотрите на следующий код:станд :: карта <> :: вставка с использованием не Copyable объектов и единообразного инициализацию
#include <utility>
#include <map>
// non-copyable but movable
struct non_copyable {
non_copyable() = default;
non_copyable(non_copyable&&) = default;
non_copyable& operator=(non_copyable&&) = default;
// you shall not copy
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
int main() {
std::map<int, non_copyable> map;
//map.insert({ 1, non_copyable() }); < FAILS
map.insert(std::make_pair(1, non_copyable()));
//^same and works
}
Компиляция этот фрагмент терпит неудачу, когда раскомментировав отмеченную линию на г ++ 4.7. Полученная ошибка указывает, что non_copyable
не может быть скопирована, но я ожидал, что она будет перемещена.
Почему вставка std::pair
, выполненная с использованием единой инициализации, не выполнена, но не построена с использованием std::make_pair
? Разве оба не должны производить rvalues, которые можно успешно перенести на карту?
Да, это в основном то, что я написал перед удалением моего ответа. У меня есть сомнения: почему здесь создан 'initializer_list <>'? 'std :: pair' похоже, что у него нет конструктора. Я думал, что единообразный синтаксис инициализации просто выберет регулярный конструктор 'pair <>'. –
Кроме того, элементы initializer_list <> должны быть одного типа, нет? – eladidan
+1 для обоих комментариев. В моем примере даже не должно быть 'initializer_list'. Это больше похоже на вызов конструктора std :: pair, использующий единообразную инициализацию. – mfontanini