NC
Size: a a a
NC
AP
[[unlikely]]
сделают что-то похожееO
void send(const Type & type, Message && msg)После msg идет еще 1-3 параметра в зависимости от перегрузки.
{
send_impl(type, std::move(msg));
}
void send_impl(const Type & type, Message && msg)
{
//...
}
AN
O
send_impl
, если это нежелательное поведение — стоит в is_valid_arg_sequence_helper_v потребовать соответствие точному ссылочному типу и не вызывать его через remove_cvref
ID
send_impl
, если это нежелательное поведение — стоит в is_valid_arg_sequence_helper_v потребовать соответствие точному ссылочному типу и не вызывать его через remove_cvref
O
send_impl
мы могли бы ожидать, что наши параметры — не временные объекты и сохранить куда-нибудь ссылку во вне. В случае, требуй мы точного типа, пользователь был бы вынужден не передавать временные объекты. Но, кажется, этому подвержен и оригинальный код, так что полагаю, мой пример корректенID
send_impl
мы могли бы ожидать, что наши параметры — не временные объекты и сохранить куда-нибудь ссылку во вне. В случае, требуй мы точного типа, пользователь был бы вынужден не передавать временные объекты. Но, кажется, этому подвержен и оригинальный код, так что полагаю, мой пример корректенO
std::tuple
здесь — худший кандидат, во-вторых, можно объявить в качестве аргумента конкретное инстанцирование std::tuple, это не потребует делать функцию шаблоннойAK
ID
std::tuple
здесь — худший кандидат, во-вторых, можно объявить в качестве аргумента конкретное инстанцирование std::tuple, это не потребует делать функцию шаблоннойID
std::tuple
здесь — худший кандидат, во-вторых, можно объявить в качестве аргумента конкретное инстанцирование std::tuple, это не потребует делать функцию шаблоннойO
tuple
, содержащего ссылки совершенно ничем не будет отличаться от варианта с приёмом ссылок. У вас в любом случае будут возможны висячие ссылки, если вы их куда-то сохраните. Самоё надёжное — принимать по значению