関数引数の暗黙的なインスタンス化の仕組みを理解しようとしています。何らかの理由で、最初の例では、bar()
コールは、{12,41}
をイニシャライザリストとして解釈します。 foo
の署名をauto foo(std::pair<int,int> bar)
に変更すると、{12,41}
は暗黙的にstd::pair<int,int>
に変換されます。関数引数の暗黙的なインスタンス化
template<typename T, typename U>
auto foo(std::pair<T,U> arg) { return arg; }
auto bar() { return foo({12,41}); }
例えば
はエラーで失敗します。
<source>: In function 'auto bar()':
104 : <source>:104:50: error: no matching function for call to 'foo(<brace-enclosed initializer list>)'
auto bar() { return foo({12,41}); }
^
103 : <source>:103:6: note: candidate: 'template<class T, class U> auto foo(std::pair<_T1, _T2>)'
auto foo(std::pair<T,U> arg) { return arg; }
^~~
103 : <source>:103:6: note: template argument deduction/substitution failed:
104 : <source>:104:50: note: couldn't deduce template parameter 'T'
auto bar() { return foo({12,41}); }
^
しかし
auto foo(std::pair<int,int> arg) { return arg; }
auto bar() { return foo({12,41}); }
作品を。なぜ誰かが精巧に考えていますか?