1
#include <iostream>
#include <functional>
template<typename T>
struct id { typedef T type; };

template<typename T>
void f(T b, typename id<T>::type* a){}

int main() {
   f(0, 0);
}

vs2013:好的!

g++4.8.2:compile error,such is the info:

main.cpp: In function 'int main()':
main.cpp:10:10: error: no matching function for call to 'f(int, int)'
     f(0,0);
          ^
main.cpp:10:10: note: candidate is:
main.cpp:7:6: note: template<class T> void f(T, typename id<T>::type*)
 void f(T b, typename id<T>::type* a){}
      ^
main.cpp:7:6: note:   template argument deduction/substitution failed:
main.cpp:10:10: note:   mismatched types 'typename id<T>::type*' and 'int'
     f(0,0);
          ^
4

1 回答 1

2

原因是标准一直不清楚具有部分复合类型(例如指针星)的非推导上下文会发生什么,从而导致参数不匹配但仍然可以通过隐式转换接受参数

问题http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1184确实通过添加注释来解决此问题,该注释说类似于函数参数不包含模板参数的情况推导出来,还应允许隐式转换以弥合不匹配。

从那时起,在模板参数的参数推导过程中发现了关于处理这些“隐式转换”的其他问题,并由http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html处理第1391

总的来说,我认为 1184 的效果是 GCC 应该接受你的代码,但是由于 #1391 中反映的其他情况下的问题,他们可能推迟了 #1184 的实施,直到制定出确切的细节。

于 2014-04-12T15:45:35.367 回答