が動作していない:C++テンプレート控除は、次のコードの場合
#include<functional>
template<typename T>
void f(std::function<void(T)> g) {
}
template<typename T>
void g(T x) {
}
int main() {
f(&g<int>);
}
C++ 14コンパイラはエラーを生成します。
no matching function for call to 'f(<unresolved overloaded function type>)'
f(&g<int>);
テンプレート引数控除はここで働いていない理由を私は好奇心旺盛です。 グラムの引数はint型であることを考えると、我々は、Fの引数は、それゆえT = int
Fで、タイプstd::function<void(int)>
のものであり、と推論することができ、ということらしいです。なぜこれは起こりませんか?私はこれを説明するC++標準の関連セクションに興味があります。 Tは、ここでは推論されていない状況で発生するか?
次のようなコードはコンパイルされます。
#include<vector>
template<typename T>
void f(std::vector<T> vec) {
}
int main() {
f(std::vector<int>{});
}
だから、非推定されるコンテキストを作成して角括弧ではありません。
'f(標準::機能(g ));' 作品 –
xis
ありがとう、ありがとう。実際には、f(&g );同様に動作します。私の問題は、標準で書かれていることに基づいてこれらの動作を説明することができないことです。 –