Действительно, «вложенные типы» одинаковы.
Тип, квалифицированный как const
и / или volatile
, является «версией» неквалифицированного типа ( [basi * 1021) * .type.qualifier] в стандарте, 6.3.8, пункт 1) - даже если это не совсем то же самое. Это не похоже на указатель или ссылку, которые, будучи введенными, образуют совершенно другой тип, чем тип, на который они указывают или на который ссылаются (пункты [dcl.ref] и [dcl.ptr] стандарта, 9.3.3.1 и 9.3.3.2, абзац 1 в обоих).
Стоит также отметить, что типы области действия класса не получают const
-квалификацию, поскольку вы получаете их из const
версия типа - например, std::vector<int>::iterator
точно такой же тип, как std::add_const_t<std::vector<int>>::iterator
- но не того же типа, что и std::vector<int>::const_iterator
.