Я понимаю, почему такие вещи так, как они есть, вопросы обычно не самые лучшие, но есть много людей на SO, которые настроены на стандартные обсуждения в комитетах, поэтому я надеюсь, что на это можно ответить фактически, так как я законно любопытно что ответ есть.
В принципе, мне потребовалось много времени, чтобы выяснить, что происходит с подписью шаблона std::result_of
в первый раз, когда я это увидел: я думал, что это совершенно новая конструкция параметров шаблона, которую я никогда раньше не видел.
template< class F, class... ArgTypes >
class result_of<F(ArgTypes...)>;
Подумав об этом некоторое время, я понял, что это на самом деле: F(ArgTypes...)
- это тип функции, но не тип функции, результат которой оценивается (это просто F
): это тип функции, принимающей аргументы ArgTypes...
и возвращающий тип F
.
Разве это... нечетно? Вид хаки? Кто-нибудь знает, когда комитет когда-либо обсуждал какие-либо альтернативы, например, следующее...
template< class F, class... ArgTypes >
class result_of<F, ArgTypes...>;
?
Я предполагаю, что возможны ситуации, когда вторая конструкция не может быть использована так же легко, как первая, но какие?
Я не пытаюсь судить об этом, но это просто то, что это было в первый раз запутано для меня в первый раз, когда я это увидел, поэтому мне любопытно, есть ли веские основания для этого. Я понимаю, что часть ответа может быть просто "потому что Boost сделала это" таким образом, но все же оставила оставшиеся (фактические) вопросы...
-
Есть ли техническая причина Boost для выбора этого синтаксиса для кодирования информации типа, а не для любой альтернативы?
-
Было ли обсуждение комитетом С++ 11 о том, насколько это необходимо для стандартизации, учитывая, что
std::result_of
может быть реализовано в терминахdecltype
довольно легко в любом случае?