Я реализую некоторые классы для представления отображений (в математическом смысле), т. Е. F: R x R ^ n -> R ^ n. Я хотел бы реализовать абстрактный базовый класс, который либо:
1) Принимает std :: array в качестве ссылки и модифицирует его
или же
2) возвращает std :: array (по значению или по ссылке, не уверен?)
Синтаксис варианта 2 более желателен для меня просто потому, что я думаю, что код будет больше похож на математику, которую я пытаюсь представить, но я хочу убедиться, что я не копирую ненужные вещи и не вызываю кучу нежелательных накладные расходы. Например, если бы я имел:
// Function f declaration
std::array<double, 4> f(double t, const std::array<double, 4> & x);
// Some code snippet that uses f
std::array<double, 4> x = {0.0, 1.0, 2.0, 3.0};
double t = 0.0;
std::array<double, 4> dxdt = f(t, x);
Как я могу определить, выполняется ли копирование в последней строке, или как я могу убедиться, что не произойдет ?
В определении f (), что мне нужно сделать (если что-нибудь), чтобы гарантировать, что это будет возвращено без вызова конструктора копирования? Я хочу, чтобы использование было простым, чтобы клиенты не использовали указатели или умные указатели, но, возможно, это необходимо?
Я знаю, что могу изменить это, чтобы вернуть void, и просто сделать один из аргументов std :: array dxdt, но мне больше нравится синтаксис возвращаемого значения, если нет проблем с производительностью или проблем утечки памяти.