【发布时间】:2019-02-06 20:04:47
【问题描述】:
在以下示例中,对mkPair2 的调用的类型推断失败:
#include <functional>
template <class A, class B>
struct Pair {
A left; B right;
};
template <class A, class B>
Pair<A,B> mkPair1 (A left, B right) {
return (Pair<A,B>) { left, right };
}
template <class A, class B>
std::function<Pair<A,B>(B)> mkPair2 (A left) {
return [left] (B right) {
return (Pair<A,B>) { left, right };
};
}
Pair<int, char> ex1 = mkPair1 (2, 'a');
Pair<int, char> ex2 = mkPair2 (2) ('a');
问题是mkPair2 有两个模板参数,但是调用(2) 只提供了其中一个,所以编译器立即举手并确定程序是模棱两可的,即使第二种类型可以从以下('a') 调用中推断出来。
这可以通过手动为编译器提供类型mkPair2<int,char> (2) ('a') 来解决,但必须像这样握住编译器的手很快就会变老。
如果每种类型最终都会被解析,是否有任何方法可以诱使编译器继续进行类型检查?
【问题讨论】:
-
Yes.
-
您可能有兴趣阅读perfect forwarding。
标签: c++ type-inference