Почему T1 и T2 имеют одинаковый идентификатор типа, но не являются одним и тем же типом? (Вывод 1 0)
#include <iostream>
#include <typeinfo>
#include <type_traits>
int main()
{
using T1 = decltype("A");
using T2 = const char[2];
std::cout << (typeid(T1) == typeid(T2)) << "\n";
std::cout << std::is_same_v<T1,T2> << "\n";
}
Отличная идея, спасибо
Кстати, в последних компиляторах можно использовать std::source_location::current().function_name().





T1 имеет тип const char(&)[2]. Ссылка является псевдонимом const char[2] и имеет тот же typeid.
#include <iostream>
#include <typeinfo>
#include <type_traits>
int main()
{
using T1 = decltype("A");
using T2 = const char[2];
using T3 = T2&;
std::cout << (typeid(T1) == typeid(T2)) << "\n";
std::cout << std::is_same_v<T1,T3> << "\n";
}
Выход
1
1
Часто ли ставить (&) в скобках? Неправильно ли опускать их?
Что ты имеешь в виду? Вы можете typedef char T2[2]; или typedef char (&T1)[2];. Тип T1 является ссылкой T2&.
Ага, понятно. Вот откуда паренки. Это похоже на синтаксис указателя функции
@Thomas Это приоритет оператора. Если вы опускаете круглые скобки, вы определяете массив ссылок на символы вместо ссылки на массив символов.
Спасибо. Это просто выглядит странно, так как скобки обычно ничего не могут быть опущены. Как (1) идентично 1. Но здесь нам нужно рассмотреть невидимое имя внутри скобок.
Строковый литерал типа "A" является выражением lvalue , так как эффект decltype приводит к ссылке на lvalue, поэтому T1 будет const char (&)[2].
если категория значения выражения lvalue, то decltype дает
T&;
T2 — это const char[2], а typeid на T1 даст результат, относящийся к указанному типу, то есть const char[2], поэтому typeid(T1) == typeid(T2) — это true, а std::is_same_v<T1,T2> — это false.
Если type является ссылочным типом, результат ссылается на объект std::type_info, представляющий
the cv-unqualified version (since C++11)ссылочного типа.