Принимая параметры поближений путем ссылки на RVALUC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Принимая параметры поближений путем ссылки на RVALU

Сообщение Anonymous »

В обзоре кода мой коллега и я обсуждали интерфейс для функции, которую я писал. Наша кодовая база использует C ++ 17, и мы не используем исключения (видеоигры). < /P>

Я утверждал, что идиоматический способ принятия параметров поближений будет эффективным, при этом также сохраняя интерфейс гибким, что позволяет вызывающему абоненту передавать копию или перемещение из собственного значения. Под идиоматическим способом я имею в виду либо одну функцию, принимающую параметр по значению, либо набор перегрузки для ссылок на константу и 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);
вызывающий абонент знает, что F взял на себя ответственность за x . С < /p>

Код: Выделить всё

void g(T&& x);
< /code>

g
может иметь право собственности или не может, в зависимости от реализации f .

Есть ли лучший способ? Я упускаю какой -то аргумент так или иначе?

Подробнее здесь: https://stackoverflow.com/questions/615 ... rce-perfor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»