为什么libstdc ++-v3中的declval的实现看起来如此复杂?

问题描述

以下代码来自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
  1. 为什么libstdc ++-v3中的实现看起来如此复杂?
  2. 第一个代码段中的模板1有什么作用?
  3. 为什么__declval需要一个参数(int / long)?
  4. 为什么模板1(int)和模板2(long)具有不同的参数类型?
  5. 我的简单实现是否存在任何问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)