В этом конкретном примере, каковы последствия для производительности при использовании одной реализации по сравнению с другой?
Универсальные ссылки, как их называет Скотт Мейерс, в первую очередь существуют не по соображениям производительности,но, грубо говоря, обрабатывать обе ссылки L- и Rvalue одинаково, чтобы избежать бесчисленных перегрузок (и для возможности распространения всей информации о типах во время пересылки).
[...] такВременные работы не создаются.Правильно ли это обоснование?
Rvalue-ссылки не препятствуют созданию временных файлов.Rvalue-ссылки - это те ссылки, которые могут быть привязаны к временным файлам (кроме ссылок на const lvalue)!Конечно, в вашем примере будут временные файлы, но ссылка на значение может быть привязана к нему.Универсальная ссылка сначала должна подвергнуться свертыванию ссылки, но в конце поведение в вашем случае будет идентичным:
// explicitly created temporary
w_uref.setName(std::string("Adela Novak"));
// will create temporary of std::string --> uref collapses to rvalue ref
// so is effectively the same as
w_rref.setName("Adela Novak");
Используя ссылку rvalue с другой стороны, вы принудительно назначаете временное значение как std::string&&
не может привязаться к этому литералу.
w_rref.setName("Adela Novak"); // need conversion
Таким образом, компилятор создаст временный std::string
из литерала, на который ссылается rvalue, а затем может привязаться к нему.
Я не знаюна самом деле не понятно, почему.
В этом случае шаблон будет преобразован в const char(&)[12]
, и, таким образом, временное std::string
не будет создано в отличие от случая выше.Следовательно, это более эффективно.