上下文相关的模板参数推导-参数的类型/值不匹配

问题描述

最小示例

#include <vector>
#include <tuple>

template<typename T>
void function(std::vector<T> vec)
{
    auto tup = std::tuple<decltype(vec)::iterator>(vec.begin());
}

int main(int argc,char* args[])
{
    std::vector<int> vec = {1,2,3};

    auto tup = std::tuple<decltype(vec)::iterator>(vec.begin());

    function(vec);
    return 0;
}

试图编译给出的东西

error: type/value mismatch at argument 1 in template parameter list for ‘template<class ... _Elements> class std::tuple’
auto tup = std::tuple<decltype(vec)::iterator>(vec.begin());
                                              ^
note:   expected a type,got ‘decltype (vec)::iterator’

here中描述的解决方案建议添加一个typename。将typename放在decltype中的function前面解决了编译问题。但是:

  1. 为什么不能推断出类型?
  2. 潜在的问题是什么? (显然,编译器怀疑decltype(...):: iterator是一种类型。但是为什么它在main中有效,但在function中无效?)

解决方法

由于iterator是从属名称,因此您需要使用typename关键字来消除歧义:

auto tup = std::tuple<typename decltype(vec)::iterator>(vec.begin());
                  //  ^^^^^^^^

请注意,vec只是function中的从属名称。在main内部,它不是依赖项,因此您不必说typename