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: OK!

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 に答える