Как работает «std::add_const», когда я создаю его экземпляр с помощью «const int»?

Следующий фрагмент кода взят из реализации 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, и это синтаксическая ошибка.

Могу ли я спросить, знаю ли я что-нибудь о «слепых пятнах» по этому поводу?

Я искал похожие вопросы, но не нашел нужного ответа.

Я не являюсь носителем английского языка, поэтому, пожалуйста, поправьте меня, если мое выражение неясно.

шаблоны — это не макросы, это не просто подстановка текста. Это больше похоже на то, что происходит при создании экземпляра шаблона: godbolt.org/z/djfc6rs7v

463035818_is_not_an_ai 27.05.2024 11:02

В случае const int тип остаётся неизменным, даже если вы примените к нему add_const!

JeJo 27.05.2024 11:05

Это не имеет никакого отношения к add_const. Ваше замешательство связано с тем, как работает typedef.

Weijun Zhou 27.05.2024 11:06

Тот же способ typedef const int X; typedef const X Y; работал всегда.

n. m. could be an AI 27.05.2024 11:21

@Yksisarvinen (избыточные cv-квалификации PS, введенные typedefs, разрешены и будут игнорироваться). Это предложение ответило на мои сомнения, большое спасибо.

Meng San-Hu 27.05.2024 11:32

Дюп: Избыточные резюме игнорируются.

user12002570 28.05.2024 09:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для приведенного выше кода я получу дубликат 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

ОП явно спрашивает о реализации, поэтому вам, вероятно, следует учесть это и в своем ответе.

Weijun Zhou 27.05.2024 11:16

Другие вопросы по теме