Здравствуйте, lpd, Вы писали:
lpd>Реально мув-семантика играет сколько-то заметную роль в конечном общем быстродействии программы очень-очень редко, и это не стоит реализации ее в C++ языке, тем более такой запутанной. Там где это нужно, можно сделать у объекта руками метод Move(), в том числе для push_back().
move-семантика не 100% про производительность. Появление move-семантики оказывает влияние еще и на надежность кода. Так, благодаря move-семантики стало возможно создание moveable но не copyable типов, наглядным примером которого является unique_ptr. Стало возможно явно передавать владение тем или иным ресурсом.
Как следствие из этого теперь можно писать, например, так:
std::ifstream infile = open_input_file(...); // Бросает исключение при ошибке.
std::ofstream outfile = open_output_file(...);
...
вместо
std::ifstream infile;
open_input_file(infile);
std::ofstream outfile;
open_output_file(outfile);
И даже если исключения в проекте запрещены, благодаря move-семантике можно писать:
expected<std::ifstream> infile = open_input_file(...);
if(infile) {
expected<std::ofstream> outfile = open_output_file(...);
if(outfile) {
...
}
}
А если добавить сюда еще и лямбды, то можно дойти и до такого:
open_input_file(...).on_success([&](auto & infile) {
open_output_file(...).on_success([&](auto & outfile) {
...
});
});
Так что совокупность новых возможностей C++ позволяет теперь писать на C++ совсем в другом стиле (естественно, можно и переборщить).
Но в Rust-е с move-семантикой пошли еще дальше.