c++ - 为什么不自动确定类模板构造函数参数?

标签 c++ templates

考虑以下类:

template<typename T1, typename T2>
class Pair
{
     public:
         T1 First;
         T2 Second;
         Pair(const T1 &First, const T2 &Second) : First(First), Second(Second) { }
}

c++ 中不允许出现以下情况:

auto p = Pair(10, 10);

为什么不允许这样做?类型可以完全由构造函数调用确定。
我知道有这样的解决方法:

template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
    return Pair<T1, T2>(First, Second);
}

但为什么需要这样做呢?为什么编译器不像函数模板那样从参数中确定类型?你可能会说是因为标准不允许,那为什么标准不允许呢?

编辑:
对于那些说这是一个为什么不应该被允许的例子的人:

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 &Second, const T1 &First) : First(First), Second(Second) { }
};

auto p = Pair(10,1.0);

我可以通过函数模板重载来做到这一点:

template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T1 &First, const T2 &Second)
{
    return Pair<T1, T2>(First, Second);
}
template<typename T1, typename T2>
Pair<T1, T2> MakePair(const T2 &Second, const T1 &First)
{
    return Pair<T1, T2>(First, Second);
}

为什么函数允许这样做,但类不允许这样做?

最佳答案

这是 Bjarne Stroustrup 对此事的看法:

Note that class template arguments are never deduced. The reason is that the flexibility provided by several constructors for a class would make such deduction impossible in many cases and obscure in many more.

关于c++ - 为什么不自动确定类模板构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7921380/

相关文章:

python - 如何从 Python 中的预定义模板列出可能的组合

c++ - 检查c++中是否存在具有给定签名的函数

c++ - C 或 C++ 是否保证 array < array + SIZE?

c++ - 变体:没有用于调用 'get' 的匹配函数

c++ - 使用 CMake 从没有相对路径的子目录导入

c++ - 错误 : expected constructor, 析构函数,或 '(' token 之前的类型转换

c++ - float 模板特化

c++ - 为什么 SFINAE 只适用于这两个看似相同的函数之一?

c++ - 检查 POD 变量的变化

c# - 无法检索 WPF 中动态生成的按钮的内容