Рассмотрим следующие функции:
std::string f();
std::string const g();
Разницы между ними нет:
std::string s1 = f();
std::string s2 = g();
Теперь мы гарантируем исключение копирования, в обоих случаях мы строим непосредственно врезультирующий объект.Нет копии, нет хода.
Однако существует большая разница между:
std::string s3, s4;
s3 = f(); // this is move assignment
s4 = g(); // this is copy assignment
g()
может быть значением r, но это значение const r.Он не может связываться с аргументом string&&
, который принимает оператор присваивания перемещения, поэтому мы возвращаемся к оператору присваивания copy , параметр string const&
которого может с радостью принять значение r.
Копированиеопределенно медленнее, чем перемещение для таких типов, как string
, где перемещение является постоянным временем, а копирование является линейным и может потребовать выделения.
Не возвращать константные значения.
Кроме того, для неклассных типов:
int f();
int const g();
Эти два на самом деле одинаковы, оба возвращают int
.Это странная причуда языка, которую вы не можете вернуть const prvalue не-классового типа, но вы можете вернуть const prvalue типа class.Проще всего притвориться, что ты не можешь сделать последнее тоже, потому что не должен.