我意识到“为什么事情是这样的”问题通常不是最好的,但是在 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
相当容易地实现它?