Изучаю вывод типов в С++, и использую метод name() класса std::type_info, для печати типа, который имеет переменная:
#include <iostream>
template <class T>
void F(T& arg)
{
return;
}
int main()
{
int x = 27;
const int cx = x;
const int &clx = x;
F(x); std::cout << typeid(x).name() << std::endl;
F(cx); std::cout << typeid(cx).name() << std::endl;
F(clx); std::cout << typeid(clx).name() << std::endl;
return 0;
}
Однако, в консоль печатается три фразы: int int int. Хотя под отладкой прекрасно видно тип переменных. В чем я ошибаюсь? P.S. : компиляторы Microsoft, VS17
Во-первых, typeid примененный к выражению, возвращает тип выражения. Тип выражения в С++ никогда не включает в себя "ссылочную" часть, то есть если у вас есть int &r, то тип выражения r - это именно int, а не int &. "Ссылочность" влияет на категорию результата выражения - lvalue, prvalue, xvalue и т.п., - но не на его тип.
Точно так же рассматривает выражения и typeid.
Во-вторых, спецификация typeid явно говорит, что typeid игнорирует константность своего операнда.
Вот эти два фактора в совокупности и дают совпадение результата всех трех typeid в вашем примере.
Потому что константность и ссылочность игнорируется.
In all cases, cv-qualifiers are ignored by typeid (that is, typeid(T) == typeid(const T))
int main()
{
typeid(int) == typeid(int&); // evaluates to true
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости