Разъяснение квалификатора noException для функтора-оболочки с использованием вариантов std::is_nothrow_invocableC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Разъяснение квалификатора noException для функтора-оболочки с использованием вариантов std::is_nothrow_invocable

Сообщение Anonymous »

У меня есть мини-личная библиотека, которую я создаю, и у меня есть функтор-оболочка, который я создал, чтобы легко переходить от статических вызываемых объектов к функторам.
Например, для чего-то например std::unordered_map при использовании пользовательского хеша xxhash, вместо того, чтобы вручную оборачивать xxhash свободной функции в функтор или использовать decltype в сигнатуре и передавать указатель функции в ctor (немного повторяется):

Код: Выделить всё

std::unordered_map map(&xxhash);
вы могли бы сделать:

Код: Выделить всё

std::unordered_map map;
У меня этот компонент реализован как:

Код: Выделить всё

template 
struct func
{
template 
decltype(auto)
operator()(Ts&&... p_ts)
const
noexcept(std::is_nothrow_invocable_r_v<
std::invoke_result_t,
decltype(Fn),
Ts&&...>)
{
return std::invoke(Fn, std::forward(p_ts)...);
}
};
Мой вопрос заключается в том, учитывается ли возврат по значению в предложении noException. В зависимости от контекста вызова и определения возвращаемое значение имеет несколько возможностей того, что с ним произойдет (перемещено/скопировано, назначено/создано), и любое исключение может возникнуть за пределами функции. Итак, я предполагаю, что версии, отличной от _r_, достаточно (повторение также вызывает у меня подозрения), но я не уверен, как рассматривать предложение возврата более строго и понимать, что я добираюсь до реальной механики. о том, как return работает в абстрактной модели C++, в чем я, возможно, ошибаюсь.
Может ли кто-нибудь внести некоторую ясность по этому вопросу?
Изменить: Кроме того, я не уверен, что RVO изменится в С++ 17. здесь ничего не меняется.

Подробнее здесь: https://stackoverflow.com/questions/792 ... nothrow-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»