C ++ const引用模板函数的参数类型本身就是引用,为什么?

问题描述

我具有以下功能

template<typename T>
void f(const T& val) {
    using value_type = T;
    using sub_type = typename value_type::sub_type;
    //etc...
}

但是,我遇到了一个问题,编译器告诉我T实际上不是它的类型,而是对其的引用。在什么情况下const-references的模板参数本身可以引用?

注意,我可以通过以下方法解决上述问题:

    using value_type = std::remove_reference_t<T>;

但是我想了解在什么情况下T本身可以作为参考。

解决方法

在什么情况下const-references本身的模板参数可以引用?

这些东西是独立的。我们有一个模板参数T。然后我们有一个函数参数恰好是T const&。但是两者并没有捆绑在一起。

虽然T永远不会根据该函数参数被推导为引用类型,但是推导并不是提供模板参数的唯一方法:

template <typename T>
void f(T const& val);

void g(int i) {
    f<int&>(i);
}

在这里,我明确提供int&作为T的模板参数,但不推论。 T在这里将是int&(而不是int),实际上val甚至不是对const的引用,实际上是{ {1}}(不是int&)。

当然,典型用法只是int const&(无显式模板参数),它会推论f(i)T,并且int的类型为{{1} }。