пытаюсь сделать класс "строка" (Str, усеченная версия std::string)
есть такой код:
Str s3 = s1+" "+s2;
в данный момент у Str есть operator+ который в итоге создает объект равный "s1+" "+s2" (временный), для создания s3 используется конструктор Str, а как добиться того чтобы вызывался "moving constructor"? а то для выполнения = сначала вызывается конструктор, создающий s3 на основе временного объекта, а потом деструктор, для временного объекта.
использую Visual Studio 2012.
Здравствуйте, SVV, Вы писали:
SVV>а как добиться того чтобы вызывался "moving constructor"?
Реализуй конструктор
Str(Str&& sourceString) {
...
}
SVV> а потом деструктор, для временного объекта.
Раз временный объект существует, то придётся его разрушить в любом случае. Другое дело, что можно так написать код, что после перемещения в нём уже может не останется ресурсов, которые нужно освобождать.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, SVV, Вы писали:
SVV>>а как добиться того чтобы вызывался "moving constructor"? W>Реализуй конструктор
есть такой, не вызывается. W>
Str(Str&& sourceString) {
W> ...
W>}
у меня operator+ возвращал const Str& что не правильно. убрав const я убрал временный объект, но тогда операции суммирования стали происходить в объекте s1
Здравствуйте, SVV, Вы писали:
SVV>у меня operator+ возвращал const Str& что не правильно. убрав const я убрал временный объект, но тогда операции суммирования стали происходить в объекте s1
operator+ должен возвращать просто Str, без всяких ссылок, то есть новый объект.
Это обычно operator+= возвращает ссылку (на изменённого себя).
SVV>в данный момент у Str есть operator+ который в итоге создает объект равный "s1+" "+s2" (временный), для создания s3 используется конструктор Str, а как добиться того чтобы вызывался "moving constructor"? а то для выполнения = сначала вызывается конструктор, создающий s3 на основе временного объекта, а потом деструктор, для временного объекта.
Здравствуйте, Vamp, Вы писали:
SVV>>в данный момент у Str есть operator+ который в итоге создает объект равный "s1+" "+s2" (временный), для создания s3 используется конструктор Str, а как добиться того чтобы вызывался "moving constructor"? а то для выполнения = сначала вызывается конструктор, создающий s3 на основе временного объекта, а потом деструктор, для временного объекта.
V>Приведи прототипы функций и конструкторов класса.
жирным в последней строке кода выделил то что уже убрал. и суммирование в s1 прекратилось. оно происходит во временном объекте. move constructor не вызывается
спасибо. правда std::move я пока что выбросил. в теле operator+ приходится по-другому действовать (иначе как минимум нужен Str::operator+=).
к тому же, этот std::move приводит к вызову move constructor для s1 (в выражении Str s3(s1+" "+s2) что для меня непонятно.
SVV>спасибо. правда std::move я пока что выбросил. в теле operator+ приходится по-другому действовать (иначе как минимум нужен Str::operator+=). SVV>к тому же, этот std::move приводит к вызову move constructor для s1 (в выражении Str s3(s1+" "+s2) что для меня непонятно.
Может быть кто-то знает почему обработка выражения
Str s3(s1+" "+s2);
начинается с вызова
Str::Str (const Str &s)
для s1? т.е. создается дубликат s1...
точнее как избежать создания дубликата, который делается чтобы суммирование не изменило значение s1
К>А есть ли разница? Если не будет NRVO, то случится move. В случае переменной temp, этот move уже есть.
Тоже правда. Код c точки зрения результата эквивалентен. Готов признать, что твой чуть краше смотрится.