Если вам действительно нужна копия, все равно разумно принять const &
. Например:
bool isprint(std::string const &s) {
return all_of(begin(s),end(s),(bool(*)(char))isprint);
}
Если вы измените это значение, чтобы взять строку по значению, вы в конечном итоге перемещаете или копируете параметр, и в этом нет необходимости. Скорее всего, не только копирование / перемещение скорее дороже, но и новый потенциальный сбой; копия / перемещение может вызвать исключение (например, распределение во время копирования может завершиться с ошибкой), тогда как ссылка на существующее значение не может быть.
Если вам do нужна копия, тогда передача и возврат по значению обычно (всегда?) лучший вариант. На самом деле я вообще не стал бы беспокоиться об этом в C ++ 03, если вы не обнаружите, что дополнительные копии фактически вызывают проблемы с производительностью. Копирование elision кажется довольно надежным для современных компиляторов. Я думаю, что скептицизм и настойчивость людей в том, что вы должны проверить свою таблицу поддержки компилятора для RVO, в большинстве случаев устарели.
Короче говоря, C ++ 11 ничего не меняет в этом отношении, кроме для людей, которые не доверяли копированию.
Вы можете использовать это так - присоединяясь к UserDetail
cte
WITH UserDetail (UserId, UserName)
AS
(
SELECT TOP(10) U.UserId,U.UserName
FROM UserTable U
),
UserAction (ActionName,ActionType)
AS
(
SELECT TOP(10) A.ActionName,A.ActionType
FROM ActionTable A inner join UserDetail
on A.UserId = UserDetail.UserId
)
ИЛИ вы можете использовать подзапрос
WITH UserDetail (UserId, UserName)
AS
(
SELECT TOP(10) U.UserId,U.UserName
FROM UserTable U
),
UserAction (ActionName,ActionType)
AS
(
SELECT TOP(10) A.ActionName,A.ActionType
FROM ActionTable A
where A.UserId in (select UserDetail.UserId from UserDetail)
)