下面的代码来自 libstdc++-v3 std::type_traits
,它是一个实现std::declval
:
template<typename _Tp, typename _Up = _Tp&&> // template 1
_Up
__declval(int);
template<typename _Tp> // template 2
_Tp
__declval(long);
template<typename _Tp> // template 3
auto declval() noexcept -> decltype(__declval<_Tp>(0));
但我想我可以declval
简单地实现:
template <typename T> T declval();
这是我的测试代码:
#include <iostream>
using namespace std;
struct C {
C() = delete;
int foo() { return 0; }
};
namespace test {
template <typename T> T declval();
};// namespace test
int main() {
decltype(test::declval<C>().foo()) n = 1;
cout << n << endl;
}
构建和运行命令是:
g++ -std=c++11 ./test.cpp
./a.out
- 为什么 libstdc++-v3 中的实现看起来如此复杂?
- 第一个片段中的模板 1 有什么作用?
- 为什么
__declval
需要一个参数(int
/long
)? - 为什么模板 1 (
int
) 和模板 2 (long
) 有不同的参数类型? - 我的简单实现有什么问题吗?