0

我有以下功能:

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

但是,我遇到的问题是编译器告诉我 T 实际上不是它的任何类型,而是对它的引用。这怎么可能,在什么情况下 const 引用的模板参数本身引用?

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

    using value_type = std::remove_reference_t<T>;

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

4

1 回答 1

3

这怎么可能,在什么情况下 const 引用的模板参数本身引用?

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

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

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

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

在这里,我明确提供int&作为 的模板参数T,它不是推导出来的。T, 在这里, 将是int&(not int) 并且实际上val甚至不是对这里的引用const, 它实际上是int&(not a int const&)。

当然,典型的用法只是f(i)(没有显式的模板参数),它会推断Tint和hasval是 type int const&

于 2020-11-09T23:00:04.197 回答