Почему `std :: is_const_v` не ведет себя должным образом? - PullRequest
0 голосов
/ 02 декабря 2018
#include <iostream>
#include <type_traits>

using namespace std;

template<typename T>
void f(T&&)
{
    cout << boolalpha << std::is_const_v<T> << endl;
    cout << boolalpha << std::is_const_v<T&&> << endl;
}

int main()
{
    const int n = 1;
    f(n);
}

Вывод:

false
false

Здесь n является очевидной константной переменной, почему std::is_const_v ведет себя не так, как ожидалось?

1 Ответ

0 голосов
/ 02 декабря 2018

std::is_const равно false, если тип является ссылочным:

cppreference:

Если T является ссылочным типом, тогда is_const<T>::value всегда ложно.Правильный способ проверки типа потенциальной ссылки на константу состоит в том, чтобы удалить ссылку: is_const<typename remove_reference<T>::type>

В вашем конкретном случае T является ссылкой для пересылки, которая будет выведена какСсылка lvalue при передаче аргумента lvalue.Вот почему вы видите false в двух случаях.

...