为什么编译器不能从返回类型中推导出模板参数?

Fil*_* S. 2 c++ templates

给出以下代码

#include <vector>
#include <memory>

using namespace std;

class MyBase
{};

class MyDerived : public MyBase
{};

template<class Base, class Derived>
vector<Base> makeBaseVec(const Derived& obj, const typename vector<Base>::size_type size)
{
    vector<Base> out;
    for (typename vector<Base>::size_type i = 0; i < size; i++)
    {
        out.push_back(Base(obj) /* copy constructor */);
    }

    return out;
}

int main()
{
    MyDerived a;
    vector<MyBase> v = makeBaseVec<MyBase>(a, 10);
}
Run Code Online (Sandbox Code Playgroud)

实例

为什么我会收到错误

main.cpp:13:14: note:   template argument deduction/substitution failed:
main.cpp:29:41: note:   couldn't deduce template parameter 'Base'
     vector<MyBase> v = makeBaseVec(a, 10);
                                         ^
Run Code Online (Sandbox Code Playgroud)

编译器是否应该能够Base从类型中推导出模板参数v

我可以通过改变第27行来纠正这个问题

vector<MyBase> v = makeBaseVec<MyBase>(a, 10);
Run Code Online (Sandbox Code Playgroud)

但这感觉不必要.

Sto*_*ica 7

编译器是否应该能够从类型中推导出模板参数Base v

该类型的v,当你调用不是由模板类型推演机制考虑makeBaseVec.如果您要调用该函数并丢弃返回值,该怎么办?

返回类型不参与类型推导或重载解析.

如果您不想重复自己,可以v改为使用类型扣除:

auto v = makeBaseVec<MyBase>(a, 10);
Run Code Online (Sandbox Code Playgroud)

事实上,几乎总是auto一个很好的变量政策.