Проверка, есть ли у нас тип const

У меня есть следующий c ++ 11-код:

#include <iostream>
#include <type_traits>

template<typename T> void overload(T&& t);
template<> void overload<char&>(char& t) { std::cout << "char& called" << std::endl; }
template<> void overload<const char&>(const char& t) { std::cout << "const char& called" << std::endl; }

int main() {

std::cout << "const char: " << ((std::is_const<const char>::value)?"const":"non-const") << std::endl;
std::cout << "const char&: " << ((std::is_const<const char&>::value)?"const":"non-const") << std::endl;

const char c = 'c';
overload(c);

return 0;
}

При беге получаю

const char: const
const char&: non-const
const char& called

Мне интересно, почему второй звонок std::is_const не видит константу, тогда как вызов перегрузки видит ее.

Какие-нибудь мысли?

Этот вопрос тесно связан с этим:
Вывод типа в шаблонных функциях и const quailifier но все же немного по-другому.

3

Решение

Вы, кажется, путаете уровни константности.

is_const правильно сообщает, что типу не хватает const верхнего уровня (const char&const будет правдой, если законно).

Ваша перегрузка соответствует правильной функции на константе, оставленной &,

Попробуйте то же самое с указателями, char*, const char*, char* const а также const char*const чтобы увидеть уровни лучше.

2

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

То, что должно быть сказано о const верхнего уровня, было сказано в комментариях и других ответах. Как вы получаете то, что вы, вероятно, хотели бы видеть: использовать std::remove_reference

std::is_const<std::remove_reference<const char&>::type>::value
1

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