- gcc выводит
T
типа int&
, const T t = val
, означает t const bind to val, почему const
не имеет эффекта?
Эта подпись шаблона функции
template <typename T> void fcn(T &&val);
использует ссылку для пересылки.Короче говоря, при выводе экземпляра с lvalue int
(ваш случай) вы получите T = int&
, то есть, включая ссылку.Свертывание ссылок преобразует void fcn(T& &&val)
в void fcn(T& val)
.
Когда вы объявляете const T t
, это означает, что T& const
(const
изменяет то, что слева, и если слева ничего нет, оно модифицируетчто справа).Но это недопустимо, поскольку не существует такой вещи, как const
-качественная ссылка, следовательно, const
-квалификатор отбрасывается.
Я использовал typeid(t).name()
, чтобы показать тип т. Почему просто вывести i
?
typeid(t).name()
не требуется для вывода понятного человеку идентификатора.i
означает int
, поэтому, в зависимости от компилятора, это то, что вы должны ожидать.Однако при работе с clang
или gcc
часто лучше отображать тип через
template <class T> p(T&&) { std::cout << __PRETTY_FUNCTION__; }
p(t); // prints out understandable type info