今天我的问题很简单:为什么编译器不能从类构造函数中推断模板参数,就像它可以从函数参数那样做?例如,为什么以下代码无效:
template<typename obj>
class Variable {
obj data;
public: Variable(obj d)
{
data = d;
}
};
int main()
{
int num = 2;
Variable var(num); //would be equivalent to Variable<int> var(num),
return 0; //but actually a compile error
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,我明白这是无效的,所以我的问题是为什么不是呢?允许这会产生任何重大的句法漏洞吗?是否存在不希望使用此功能的实例(推断类型会导致问题)?我只是想了解允许函数的模板推理背后的逻辑,但不适用于适当构造的类.
template< class T >
class Foo {
public:
Foo( T t ) { }
};
int main () {
int i = 0;
Foo f( i );
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,编译器抱怨在'f'之前缺少模板参数.我理解从构造函数的参数中推导出类的模板参数不是标准的一部分,但我的问题是为什么?编译器是否具有隐式实例化Foo<int>和调用其构造函数所需的所有信息?
编辑要清楚的是我打电话与构造int(而不是一个short,long,void*,等)
考虑以下课程:
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
}
Run Code Online (Sandbox Code Playgroud)
c ++中不允许以下内容:
auto p = Pair(10, 10);
Run Code Online (Sandbox Code Playgroud)
为什么不允许这样做?类型可以从构造函数调用中完全确定.
我知道有一些解决方法,如:
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
return Pair<T1, T2>(First, Second);
}
Run Code Online (Sandbox Code Playgroud)
但为什么需要呢?为什么编译器不能像从函数模板那样从参数中确定类型?你可能会说它因为标准不允许它,所以为什么标准不允许呢?
编辑:
对于那些说这是一个例子的人,为什么不允许这样做:
template<typename T1, typename T2>
class Pair
{
public:
T1 First;
T2 Second;
Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
Pair(const T2 …Run Code Online (Sandbox Code Playgroud) C++ 0x是否具有(或者某个时间点的C++ 0x)构造函数的模板参数推导?在Coming C++(C++ 0x)标准概述中,我看到以下几行:
std::lock_guard l(m); // at 7:00
std::thread t(f); // at 9:00
Run Code Online (Sandbox Code Playgroud)
这是否意味着委派make_foo功能模板最终是多余的?