От другого вопрос Я вижу этот код:
template <typename T>
std::set<T> getUnion(const std::set<T>& a, const std::set<T>& b)
{
std::set<T> result = a;
result.insert(b.begin(), b.end());
return result;
}
Разве мы не можем просто использовать приведенный ниже код? :
template <typename T>
std::set<T> getUnion(std::set<T> a, const std::set<T>& b)
{
a.insert(b.begin(), b.end());
return a;
}
Есть ли разница?
Я не могу понять причину использования первого подхода.
Второй код запрещает RVO?
Первая версия занимает std::set
по ссылке, что означает, что вы не получите копию переданного аргумента. Копия на самом деле происходит при инициализации result
с a
, Вторая принимает аргумент по значению, что означает, что в зависимости от категории значения аргумента компилятор вызовет конструктор копирования / перемещения. В частности, если аргумент является lvalue, он копируется и, если rvalue, перемещается.
В первом примере компилятор, скорее всего, откажется от операции копирования из оператора return, оптимизации, известной как оптимизация возвращаемого значения (RVO). Вторая версия не может этого сделать, поскольку вы не возвращаете локальную переменную. Таким образом, вы можете видеть, что вторая версия функции должна выполнять как минимум одну дополнительную операцию копирования или перемещения, в то время как первая имеет дело только с одной.
На самом деле эти две функции эквивалентны. Либо новый набор создается копией аргумента, который соответствует параметру a при вызове функции
template <typename T>
std::set<T> getUnion(std::set<T> a, const std::set<T>& b)
{
//...
или он создается внутри тела функции
template <typename T>
std::set<T> getUnion(const std::set<T>& a, const std::set<T>& b)
{
std::set<T> result = a;
//...
Однако читателям кода становится понятнее, когда функция определена, как в первом случае.
template <typename T>
std::set<T> getUnion(const std::set<T>& a, const std::set<T>& b);
Например, функция может быть объявлена как
template <typename T>
std::set<T> getUnion( const std::set<T> &a, std::set<T> b);
не мог это?
Это разнообразие только вызывает вопросы.