问题描述
我具有以下功能:
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} }。