编译器行为不一致

时间:2017-08-27 08:34:47

标签: c++ gcc visual-c++ template-meta-programming

我看到gcc,clang和msvc 2015/2017之间存在一些不一致之处。以下命令在msvc上失败,但不是gcc或clang。这些元函数应该返回函数签名类型中的参数类型:

template <int _ParamNum, typename _Ty> struct _get_parameter;
template <typename _ReturnT, typename _HeadT, typename ... _TailT> 
   struct _get_parameter<0, _ReturnT(_HeadT, _TailT...)>
{
  using type = _HeadT;
};
template <int _ParamNum, typename _ReturnT, typename _HeadT, typename ... _TailT> 
   struct _get_parameter<_ParamNum, _ReturnT(_HeadT, _TailT...)> 
{
  using type = 
    typename _::template _get_parameter<_ParamNum - 1, _ReturnT(_TailT...)>::type;
};

用类似的东西调用:

using param_type = typename _get_parameter<0, decltype(printf)>::type;

我倾向于认为它是一个MSVC错误,但我希望有人能够代之以解决代码的问题。

提前致谢

修改

我的立场得到了纠正:http://rextester.com/XZEL74804这似乎与较大的代码库有一些奇怪的互动。

0 个答案:

没有答案