У `const T` и` T` нет различий при выборе вложенного типа? - PullRequest
4 голосов
/ 25 апреля 2020
#include <string>

template<typename T, typename C, typename CR>
void f()
{
    typename T::size_type*     p1{}; // ok
    typename CR::size_type*    p2{}; // error
    typename C::size_type*     p3{}; // Does the C++ standard allow this?        
}

int main()
{
    f<std::string, const std::string, const std::string&>();
}

У const T и T нет различий при выборе вложенного типа?

1 Ответ

5 голосов
/ 25 апреля 2020

Действительно, «вложенные типы» одинаковы.

Тип, квалифицированный как 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.

...