我有简单的代码来说明问题:
template <typename T>
void foo(T val){
cout << boolalpha << std::is_reference<T>();
}
int main() {
int x = 1;
foo( std::ref(x) ); //output: false
return 0;
}
问题是:尽管使用了std :: ref,为什么is_reference()的结果还是假的?
答案 0 :(得分:4)
std::is_reference
检测引用,左值(&
)和右值(&&
)。
std::ref
返回std::reference_wrapper
的实例,即
一个类类型。
还要注意,在template <typename T> void foo(T val)
中,T
永远不会被推论为参考。使其成为引用的唯一方法是不依赖模板参数推论:foo<int &>(x)
。
答案 1 :(得分:3)
std::ref
返回类std::reference_wrapper<T>
的实例。 std::reference_wrapper
对象具有对T&
的隐式转换,但它本身不是引用。