如何正确使用is_reference?

时间:2019-01-03 20:11:16

标签: c++ typetraits

我有简单的代码来说明问题:

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()的结果还是假的?

2 个答案:

答案 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&的隐式转换,但它本身不是引用。