Как правильно использовать is_reference? - PullRequest
0 голосов
/ 03 января 2019

У меня есть простой код для иллюстрации проблемы:

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;
}

И вопрос такой: почему результат is_reference () ложен, несмотря на использование std :: ref?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

std::is_reference обнаруживает ссылки, lvalue (&) и rvalue (&&).

std::ref, с другой стороны, возвращает экземпляр std::reference_wrapper, который являетсяТип класса.

Также обратите внимание, что в template <typename T> void foo(T val), T никогда не будет выводиться как ссылка.Единственный способ сделать его ссылкой - не полагаться на вывод аргумента шаблона: foo<int &>(x).

0 голосов
/ 03 января 2019

std::ref возвращает экземпляр класса std::reference_wrapper<T>.std::reference_wrapper объект имеет неявное преобразование в T&, но сам по себе не является ссылкой.

...