为什么自动类型推导仅适用于函数而不适用于类?
答案 0 :(得分:17)
在特定情况下,您总是可以执行std::make_pair
:
template<class T>
make_foo(T val) {
return foo<T>(val);
}
编辑:我刚刚在“The C ++ Programming Language,Third Edition”,第335页中找到了以下内容.Bjarne说:
请注意,类模板参数是 从未推断过。原因是 几个人提供的灵活性 一个类的构造函数会 很多人都不可能这样做 案件和更多的模糊不清。
这当然是非常主观的。在comp.std.c++
中已经对此进行了一些讨论,并且共识似乎是没有理由不支持 。这是否是一个好主意是另一个问题......
答案 1 :(得分:9)
在Kona meeting已经批准了构造函数(P0091R0)的模板参数推导,这意味着在C ++ 17中我们将能够编写:
pair p1{"foo"s, 12};
auto p2 = pair{"foo"s, 12};
f(pair{"foo"s, 12});
答案 2 :(得分:4)
如果是函数调用,编译器会从参数类型中推断出模板类型。例如std::max - 函数。编译器使用参数类型来推导模板参数。这并不总是有效,因为并非所有电话都是不明确的。
int a = 5;
float b = 10;
double result1 = std::min( a, b ); // error: template parameter ambigous
double result2 = std::min< double >( a, b ); // explicit parameter enforces use of conversion
在模板类的情况下,可能无法正常进行。以此类为例:
template< class T>
class Foo {
public:
Foo();
void Bar( int a );
private:
T m_Member;
};
类型T永远不会出现在任何函数调用中,因此编译器根本没有提示,应该使用什么类型。
答案 3 :(得分:1)
我认为隐式类型转换仅适用于函数参数,因此编译器可以推导它以使函数调用成功。
但它怎么能推断出你想要什么类型的课程。
当我们有基于AI的编译器来阅读我们的想法时,我们必须等待4天。