Я написал функцию, получающую переменное c количество std :: пар, которое вычитает 2-й элемент из 1-го элемента каждой пары и возвращает кортеж из вновь сгенерированных результатов, например:
template<typename... pairs, std::enable_if_t<((std::is_same_v<std::pair<int, int>, pairs>) && ...)>* = nullptr>
inline constexpr auto foo(pairs&& ...p) noexcept {
return std::tuple((std::get<1>(std::forward<pairs>(p)) - std::get<0>(std::forward<pairs>(p))) ...);
}
int main() {
constexpr auto bar = foo(std::pair(4, 6), std::pair(3, 7), std::pair(1, 2));
return 0;
}
Это прекрасно работает. Если я не попытаюсь передать ему std :: pair, который не является rvalue, например:
int main() {
constexpr auto tup = std::pair(4, 6);
constexpr auto bar = foo(tup, std::pair(3, 7), std::pair(1, 2));
return 0;
}
Если я попытаюсь это сделать, я получу следующую ошибку:
no matching function for call to 'foo(const std::pair<int, int>&, std::pair<int, int>, std::pair<int, int>)'
Как я могу передать std :: пар как ссылки на lvalue и rvalue на эту функцию? Я использую C ++ 17