Предположим, я хочу реализовать простую математическую функцию; например, предположим, что это повторная реализация (C++ 17's) std::clamp
: эта функция принимает число, нижнюю границу и верхнюю границу и устанавливает число в одну из этих границ, если оно выходит за пределы диапазона, который они определяют. Если это конкретный числовой тип, скажем int
, я хотел бы написать:Должны ли шаблонные математические функции принимать значения или константные ссылки?
constexpr int clamp(int x, int lower_bound, int upper_bound)
{
return x < lower_bound ? lower_bound : (upper_bound < x ? upper_bound : x);
}
, но если это шаблон, я вижу, что sample implementation, который, вероятно, что стандарт будет иметь использование const&
«s, а не значений. Таким образом, делая вещи более простые для цитирования, что-то вроде:
template <typename T>
constexpr T clip(const T& x, const T& lower_bound, const T& upper_bound)
{
return x < lower_bound ? lower_bound : (upper_bound < x ? upper_bound : x);
}
Моих вопросов:
- Есть ли польза для принятия константной ссылки, для
T
-х, которые являются простыми числовыми типами? - То же, для типов, которые являются абстрактной вещью, обертывающей одно число в качестве элемента данных (например,
std::chrono
)? - Почему это (и это вообще) лучше взять
const&
, а затем значение в общем случае любой относительно простой, (constexpr?), Свободной от побочных эффектов математической функции?
Примечание:
- Я понимаю, принимая
const&
могу начать иметь смысл, когда у вас есть, скажем, какое-то к-мерные векторный типа, илиboost::rational
с и другими числовыми подобными типами; но даже тогда, не будет ли компилятор оптимизировать копирование?
Они не могут быть _простыми числовыми типами_. Они могут быть типами, которые ведут себя как числа. Вы могли бы не копировать их в конце концов. Более того, ссылка на const ссылается на временную, а иногда и на полезную. – skypjack
'std :: complex' может быть фактическим примером типа в стандарте C++, для которого' const T & 'будет лучше, чем просто' T'. – Zereges
@ Zereges: Опять же, почему? Разве компилятор не оптимизировал бы разницу? – einpoklum