Return-by-value should normally be const for non-builtin return types ..
Это не правильно - одна из относительно немногих ошибок в GotW. const
Значения r были сомнительными в C ++ 03 и определенно очень плохими в C ++ 11.
Проблема в том, что в C ++ 03 у rvalues может быть любая вызванная функция-член, даже неконстантная. Это замечательно, потому что вы можете "swaptimize" или выполнять цепочки методов и другие вещи, которые идеально подходят и имеют абсолютный смысл, но это также плохо, потому что компилятор не может поймать вас, когда вы делаете что-то глупое, например, присваивание ему или что-то в этом роде , Как правило, плохая идея ограничивать всех от хороших дел, потому что вызывающий может сделать что-то глупое. Намерение хорошее, но не правильное.
В C ++ 11 это исправлено, потому что вы можете запретить вызов функций-членов для значений rvalue, а во-вторых, потому что для правильной работы семантики перемещения значение rvalue должно быть изменяемым. Вы не можете взять ресурсы из rvalue, если оно const
.
Как примечание, причина этого в том, что у примитивных типов всегда была специальная формулировка, встроенная в язык, например, присвоение rvalues незаконно, поэтому не нужно было пытаться применять его самостоятельно, делая это const
.
Что касается шаблонов, я на самом деле не уверен. Уже было известно, что эта практика была плохой, когда я начал писать код на C ++, поэтому мне никогда не приходилось сталкиваться с этим.