Я утверждал, что идиоматический способ принятия параметров поближений будет эффективным, при этом также сохраняя интерфейс гибким, что позволяет вызывающему абоненту передавать копию или перемещение из собственного значения. Под идиоматическим способом я имею в виду либо одну функцию, принимающую параметр по значению, либо набор перегрузки для ссылок на константу и RVALUE (которые требуют одного движения в случае LVALUE, по цене какого -либо дублирования кода). < /P>
Код: Выделить всё
struct A {};
class ByValue
{
public:
ByValue(std::vector v)
: m_v(std::move(v))
{}
private:
std::vector m_v;
};
class RefOverloads
{
public:
RefOverloads(std::vector const& v)
: m_v(v)
{}
RefOverloads(std::vector&& v)
: m_v(std::move(v))
{}
private:
std::vector m_v;
};
int main()
{
std::vector v0;
ByValue value0(v0);
ByValue value1(std::move(v0));
std::vector v1;
RefOverloads ref0(v1);
RefOverloads ref1(std::move(v1));
}
< /code>
Моему коллеге, с другой стороны, не нравится, что легко неявно делать дорогие копии. Он предпочел бы, чтобы эти аргументы в отношении раковины всегда были посредством ссылки на RVALUE (без перегрузки RVALUE), и что, если вызывающий абонент хочет пройти копию, он должен сделать локальную копию и переместить ее в функцию. < /P>
class RvalueRefOnly
{
public:
RvalueRefOnly(std::vector&& v)
: m_v(std::move(v))
{}
private:
std::vector m_v;
};
int main()
{
std::vector v;
//RvalueRefOnly failedCopy(v); // Fails purposefully.
std::vector vCopy = v; // Explicit copy of v.
RvalueRefOnly okCopy(std::move(vCopy)); // Move into okCopy.
}
< /code>
Я даже не думал о таком интерфейсе. Контр-аргумент, который у меня был, заключался в том, что с помощью значения выражает намерение лучше, то есть с подписью < /p>
void f(T x);
Код: Выделить всё
void g(T&& x);
< /code>
g
Есть ли лучший способ? Я упускаю какой -то аргумент так или иначе?
Подробнее здесь: https://stackoverflow.com/questions/615 ... rce-perfor