Почему std :: result_of принимает (не связанный) тип функции в качестве аргумента типа?

Я понимаю, что «почему вещи такие, какие они есть», вопросы обычно не самые лучшие, но на 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 выбрал этот синтаксис для кодирования информации о типе, а не какой-либо альтернативы?

Было ли какое-либо обсуждение в комитете C ++ 11 о том, насколько уместно было стандартизировать это, учитывая, чтоstd::result_of может быть реализовано с точки зренияdecltype все равно довольно легко?

Ответы на вопрос(4)

Ваш ответ на вопрос