lambda 中的自动参数类型导致 "Use 'template' keyword to treat..." 错误

Auto parameter type in lambda causes "Use 'template' keyword to treat..." error

我有这个代码

struct TestClass
{
    template <typename T>
    T get()
    {
        return 0;
    }
};

void invoke(const std::function<void(const TestClass& c)>& func)
{
    func(TestClass());
}

现在如果我像下面这样使用invoke就没有问题了

invoke([](TestClass tc) {
    tc.get<int>();
});

但是,如果我将 lambda 函数中的参数类型更改为 auto,则会出现以下错误。我知道我可以通过在 get 之前插入 template 关键字来修复它,但我不明白的是为什么我会收到此错误?

error: use 'template' keyword to treat 'get' as a dependent template name
    tc.get<int>();
       ^
       template

// Happens when using `auto` as parameter type
invoke([](auto tc) {
    tc.get<int>();
});

我正在使用 clang v10.0

现在你有一个模板类型(以 auto 的形式)而不是具体类型 TestClassget 函数是依赖的,因此你需要限定它带有 template 关键字:

tc.template get<int>();