Следующий фрагмент кода взят из реализации std::add_const в libstdc++:
/// add_const
template<typename _Tp>
struct add_const
{ typedef _Tp const type; };
Если я использую int для создания экземпляра std::add_const, я получу следующее, и это имеет смысл.
struct add_const
{ typedef int const type; };
Но если я использую const int для создания экземпляра std::add_const, то мне кажется, что я получу следующее:
struct add_const
{ typedef const int const type; };
Для приведенного выше кода я получу duplicate const, и это синтаксическая ошибка.
Могу ли я спросить, знаю ли я что-нибудь о «слепых пятнах» по этому поводу?
Я искал похожие вопросы, но не нашел нужного ответа.
Я не являюсь носителем английского языка, поэтому, пожалуйста, поправьте меня, если мое выражение неясно.
В случае const int тип остаётся неизменным, даже если вы примените к нему add_const!
Это не имеет никакого отношения к add_const. Ваше замешательство связано с тем, как работает typedef.
Тот же способ typedef const int X; typedef const X Y; работал всегда.
@Yksisarvinen (избыточные cv-квалификации PS, введенные typedefs, разрешены и будут игнорироваться). Это предложение ответило на мои сомнения, большое спасибо.
Дюп: Избыточные резюме игнорируются.





Для приведенного выше кода я получу дубликат
const, и это синтаксическая ошибка.[...] ?
Нет. В случае T as const int тип остается неизменным (т. е. const int), даже если вы примените к нему std::add_const. Стандарт гарантирует, что избыточные константные квалификаторы будут игнорироваться.
Это означает, что все следующие элементы оказываются одного и того же типа: const int
const const int
const const const int
const int const
const int const const
int const const
int const const const
// .. so on ...
То же самое происходит и с typedef std::add_const. С сайта cppreference.com:
template< class T >
struct add_const; (2) (since C++11)
Предоставляет тип члена
typedef, который аналогиченT, за исключением того, что к нему добавлен cv-квалификатор (если только T не является функцией, ссылкой или уже не имеет этот cv-квалификатор).
Вы могли бы просто проверить это:
#include <type_traits>
static_assert(
std::is_same_v<std::add_const_t<int>,
std::add_const_t<const int>>, "are not same!"); // passes
ОП явно спрашивает о реализации, поэтому вам, вероятно, следует учесть это и в своем ответе.
шаблоны — это не макросы, это не просто подстановка текста. Это больше похоже на то, что происходит при создании экземпляра шаблона: godbolt.org/z/djfc6rs7v