Я уже проголосовал за ответ @NathanOliver как лучший, потому что я действительно думаю, что он предоставил информацию, которую я предоставил.С другой стороны, я хотел бы поделиться тем, что, на мой взгляд, является лучшим решением для решения этого весьма специфического сценария, когда функция более сложна, чем та, что была в моем первоначальном примере.
Проблема с решением delete
заключается в том, что он растет в геометрической прогрессии с увеличением количества параметров, предполагая, что все параметры должны остаться в силе после завершения вызова функции, и вы хотите проверить время компиляции, чтобы пользователь вашего API не пытался передать права собственности на эти параметрыфункция:
void f(const A& a, const B& b)
{
// function body here
}
void f(const A& a, B&& b) = delete;
void f(A&& a, const B& b) = delete;
void f(A&& a, B&& b) = delete;
Нам нужно delete
все возможные комбинации, и это будет трудно поддерживать в долгосрочной перспективе.Поэтому мое предлагаемое решение состоит в том, чтобы воспользоваться тем фактом, что конструктор reference_wrapper
, который переносит T
при перемещении, уже удален в STD, а затем написать следующее:
using AConstRef = reference_wrapper<const A>;
using BConstRef = reference_wrapper<const B>;
void f(AConstRef a, BConstRef b)
{
// function body here
}
Таким образом, все недопустимыеперегрузка будет автоматически удалена.Пока я не вижу никаких недостатков в этом подходе.