问题描述
以下代码来自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
)具有不同的参数类型? - 我的简单实现是否存在任何问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)