универсальная ссылка игнорирует квалификатор высшего уровня

Может кто-нибудь сказать мне, почему универные ссылки теряют квалификацию высшего уровня? Я ожидал, что вывод вернет true для const во втором и третьем вызовах функций в следующем коде.

#include <iostream>
#include <type_traits>

using namespace std;

template<class T>
void print(T const &value){
cout << "Printing from const & method: " << value << endl;
}

template<class T>
void print(T const *value){
cout << "Printing from const * method: " << *value << endl;
}

template<class T>
void f(T&& item){
cout << "T is const: " << boolalpha << is_const<decltype(item)>::value << endl;

print(std::forward<T>(item));
}int main(){

f(5);

const int a = 5;
f(a);

const int * const ptr = &a;

f(ptr);

return 0;
}

Выход:

T is const: false
Printing from const & method: 5
T is const: false
Printing from const & method: 5
T is const: false
Printing from const * method: 5

1

Решение

Как отметил Р. Мартиньо, ссылки не имеют констант верхнего уровня.

Чтобы проверить постоянство нижнего уровня, вы можете использовать std::remove_reference:

cout << "T is const: " << boolalpha
<< is_const<typename remove_reference<decltype(item)>::type>::value
<< endl;
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]