тип возвращаемого значения typeid(value).name()
Есть некий кусок кода:
#include <iostream>
#include <typeinfo>
int main() {
int a = 5;
std::string check = "int";
if (typeid(a).name() == check)
std::cout << "check variable works" << std::endl;
if (typeid(a).name() == "int")
std::cout << "just string works" << std::endl;
return 0;
}
В первом варианте, где проверка с переменной check - условие сработает, во втором - нет. Если сделать просто вывод
std::cout << typeid(a).name();
тот выведет строку "int".
Почему так происходит, если по-сути мы сравниваем с одним и тем же значением?
Ответы (2 шт):
std::type_info::name возвращает const char*(строку в стиле C, указатель)
Сравнение с check работает, так как std::string имеет перегруженный оператор сравнения
"int" имеет тип const char[4] и сравнение с ним равносильно сравнению указателей.
Для сравнения строк в стиле C используется функция strcmp
Почему так происходит, объяснено в ответе участника @Maxim Timakov. Добавлю, что если вашим намерением было сравнение типов, то стоит делать это так:
#include <iostream>
#include <type_traits>
int main() {
int a = 5;
constexpr int b = 42;
if (std::is_same_v<decltype(a), int>) {
std::cout << "ok\n";
}
if constexpr (std::is_same_v<decltype(b), const int>) {
std::cout << "ok\n";
}
}