Почему typeid печатает неверный тип?

248
28 октября 2017, 17:13

Изучаю вывод типов в С++, и использую метод 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

Answer 1

Во-первых, typeid примененный к выражению, возвращает тип выражения. Тип выражения в С++ никогда не включает в себя "ссылочную" часть, то есть если у вас есть int &r, то тип выражения r - это именно int, а не int &. "Ссылочность" влияет на категорию результата выражения - lvalue, prvalue, xvalue и т.п., - но не на его тип.

Точно так же рассматривает выражения и typeid.

Во-вторых, спецификация typeid явно говорит, что typeid игнорирует константность своего операнда.

Вот эти два фактора в совокупности и дают совпадение результата всех трех typeid в вашем примере.

Answer 2

Потому что константность и ссылочность игнорируется.

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  
}
READ ALSO
Смена компилятора в CLion

Смена компилятора в CLion

Установил g++ через brew install gcc путь до него /usr/local/bin/g++-7, но CLion использует этот /Applications/Xcodeapp/Contents/Developer/Toolchains/XcodeDefault

227
Как извлечь стили из Word на C++

Как извлечь стили из Word на C++

Пишу программу для автоматической проверки форматирования в WordСтало ясно что для извлечения стилей нужно парсить XML

233
Ошибка по адресу

Ошибка по адресу

Помогите найти ошибку

289
Как написать такую шаблонную функцию?

Как написать такую шаблонную функцию?

Не пойму как в С++11 написать такую хотелку:

210