Open apolukhin opened 3 years ago
Олег Фатхиев, 5 марта 2019, 11:16 Текущая реализация не ошибочна, std::invoke_result_t обязан принимать строго больше 0 параметров. Проблема, видимо, в overload resolution для алиасов, они не умеют принимать variadic pack-и в таком случае. Кажется подобная проблема уже была в gcc, могу ошибаться. Интересно то, что этот код работает в msvc. Нужно разобраться, что об этом говорит стандарт.
Дмитрий, 6 марта 2019, 12:14 Олег Фатхиев, std::invoke_result_t — это просто псевдоним. Он прокинет аргументы в std::invoke_result, и если их там окажется 0, то вывалится ошибки.
yndx-antoshkka, 5 марта 2019, 18:33 Это уберёт симптом, но не вылечит болезнь. Надо на уровне языка сделать так, чтобы текущая реализация работала. Тогда автоматически исправится множество подобных проблем.
Спрошу у специалистов по ядру языка, что можно с этим сделать на данный момент.
yndx-antoshkka, 5 марта 2019, 20:23 Скинули ссылку на проблему: https://wg21.link/CWG1430
Дмитрий, 6 марта 2019, 12:22 yndx-antoshkka, я внимательно прочитал ссылку, но не понял, какие оттуда следуют выводы.
Можем ли мы "вылечить болезнь"? Если не можем, то нужно хотя бы "устранить симптом", то есть все псевдонимы метафункций, которые ломают логичный и осмысленный код.
Первопричину кажется что пока не починить, придётся чинить симптомы
Перенос предложения: голоса +3, -0 Автор идеи: Дмитрий
В шаблоне-псевдониме std::invoke_result_t есть ошибка, из-за которой он не всегда работает там, где работает обычная std::invoke_result. Хотя, очевидно, они должны быть полностью взаимозаменяемы.
Суть проблемы:
Получается, что псевдоним std::invoke_result_t нарушает "сигнатуру" оригинальной метафункции std::invoke_result, ломая тем самым вполне корректный код.
Думаю, что правильная реализация будет выглядеть так:
А текущая реализация ошибочна: