【发布时间】:2019-10-06 07:16:45
【问题描述】:
查看libstdc++源码,发现如下declval实现:
template<typename _Tp, typename _Up = _Tp&&>
_Up __declval(int); // (1)
template<typename _Tp>
_Tp __declval(long); // (2)
template<typename _Tp>
auto declval() noexcept -> decltype(__declval<_Tp>(0));
Eric Niebler 的这个实现 was proposed 作为编译时优化:他解释说重载解析比模板实例化更快。
但是,我无法理解它是如何工作的。具体来说:
- 在 (1) 中,为什么使用
_Up比只返回_Tp&&更好? - 似乎从未使用过重载 (2)。为什么需要它?
所有这些如何防止模板实例化,而不是最天真的实现:
template<typename T>
T&& declval() noexcept;
【问题讨论】:
-
@Language Lawyer 很棒,所以 libc++ 实现不使用第二个参数。仍然很有趣背后的动机是什么。
-
我怀疑答案与为什么使用尾随返回类型的答案相同:It's just stylistic。但最好让 Eric 100% 确定。
标签: c++ c++11 language-lawyer template-instantiation declval