Изучаю вывод типов в С++, и использую метод 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
}
Установил g++ через brew install gcc путь до него /usr/local/bin/g++-7, но CLion использует этот /Applications/Xcodeapp/Contents/Developer/Toolchains/XcodeDefault
Пишу программу для автоматической проверки форматирования в WordСтало ясно что для извлечения стилей нужно парсить XML