Size: a a a

2020 August 06

Т8

Т-34 85 in pro.cxx
Побитый Кирпич
Мы про инициализацию Foo
А как же инициализация произойдёт, если не будет ни мува, ни копии? Ты хочешь сказать, что компилятор сразу внутри Foo разместит объект, что-ли?
источник

Т8

Т-34 85 in pro.cxx
magras
Если у объекта есть только copy конструктор, это должно говорить о том, что цена его копирования примерно равна цене мува.
Это ещё может быть ошибка. И вот чтобы её не было, разбираюсь, как грамотно сделать
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
Это ещё может быть ошибка. И вот чтобы её не было, разбираюсь, как грамотно сделать
чтоб её не было надо тесты писать
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
А как же инициализация произойдёт, если не будет ни мува, ни копии? Ты хочешь сказать, что компилятор сразу внутри Foo разместит объект, что-ли?
инициализация чего?
источник

Т8

Т-34 85 in pro.cxx
Побитый Кирпич
инициализация чего?
Поля в Foo
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
Поля в Foo
она в конструкторе произойдёт
источник

ПК

Побитый Кирпич... in pro.cxx
Foo(vector<int> vec) : vec_(std::move(vec)) {}
источник

Т8

Т-34 85 in pro.cxx
Побитый Кирпич
она в конструкторе произойдёт
А в конструктор попадёт копия vector<int>, правильно?
источник

m

magras in pro.cxx
Т-34 85
Это ещё может быть ошибка. И вот чтобы её не было, разбираюсь, как грамотно сделать
Это известно, что использование передачи по значению вместо пары перегрузок const& и && добавляет один move (или copy, но эта копия должна иметь примерно ту же цену, что move). Если это performance critical код, да, нужно писать перегрузки. Ну и да, этот прием имеет смысл использовать именно когда нужно забрать владение объектом.

Но на стороне функции ты не сможешь защититься от ошибки автора T, если он не предоставил move. Тебе все-равно понадобиться копировать для того чтобы забрать владение.
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
А в конструктор попадёт копия vector<int>, правильно?
Почему копия то?
источник

Т8

Т-34 85 in pro.cxx
Побитый Кирпич
Почему копия то?
Потому что r-value нельзя - нет такой перегрузки
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
Потому что r-value нельзя - нет такой перегрузки
Ну ты просто посмотри на код и скажи в каком месте там вызывается конструктор копирования
источник

ПК

Побитый Кирпич... in pro.cxx
Потому что я не очень понимаю где ты там видишь копию
источник

Т8

Т-34 85 in pro.cxx
Побитый Кирпич
Ну ты просто посмотри на код и скажи в каком месте там вызывается конструктор копирования
В передаче аргумента при вызове конструктора. Ты там вызываешь std::move(), но это не даст эффекта, передаст копию
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
В передаче аргумента при вызове конструктора. Ты там вызываешь std::move(), но это не даст эффекта, передаст копию
Ты ошибаешься
источник

ПК

Побитый Кирпич... in pro.cxx
move если что придуман был чтоб копий не было)
источник

ПК

Побитый Кирпич... in pro.cxx
А ты говоришь не даст эффекта
источник

Т8

Т-34 85 in pro.cxx
Побитый Кирпич
move если что придуман был чтоб копий не было)
Мув делает rvalue, но такой перегрузки нет
источник

D

Dmitriy in pro.cxx
Т-34 85
Мув делает rvalue, но такой перегрузки нет
Где ее нет?
источник

ПК

Побитый Кирпич... in pro.cxx
Т-34 85
Мув делает rvalue, но такой перегрузки нет
Есть перегрузка по значению, которая примет rvalue&&
источник