Допустим есть код:
std::vector<some_type> some_func(...) {
std::vector<some_type> result;
......
//Some code to fill vector
......
return result;
}
....
std::vector<some_type> need = some_func(...)
Что происходило в С++98 (сейчас говорим про стандарт, а не про оптимизацию компиляторов):
1. создается (конструируется) вектор need
2. выполняется функция some_func, в которой создается (конструируется) вектор result
3. по окончанию выполнения функции происходит копирование данных из вектора result в вектор need
5. выполняется деструктор вектора result
6. по выходу из области видимости выполняется деструктор вектора need
Что происходит в C++11 (неправильное зачеркнуть, описываю в грубом своем представлении, опять же разговор про стандарт):
1. если компилятор видит, что у std::vector<some_type> есть перемещающий конструктор, то вектор need фактически не создается (конструктор не выполняется), а создается "ссылка"
2. выполняется функция some_func, в которой создается (конструируется) вектор result
3. по окончанию выполнения функции происходит копирование "ссылки" вектора result в "ссылку" вектор need (десруктор result не выполняется)
4. по выходу из области видимости выполняется деструктор вектора need (ранее result)
Таким образом мы избавляемся от одного конструктора и одного деструктора? Или же конструкторы и деструкторы будут вызваны оба раза, а при перемещении произойдет лишь "передача" внутренностей?