Re[6]: Неправильная кодогенерация, MSVC 2017
От: rg45 СССР  
Дата: 17.03.20 06:48
Оценка: 16 (2)
Здравствуйте, Коваленко Дмитрий, Вы писали:

_NN>>https://gcc.godbolt.org/z/mBmEEC


КД>Это как, разрешено законом что-ли?


КД>В чем прикол такое компилировать?


Это называется injected-class-name. Имя класса вставляется в область видимости класса как открытый член-тип. Благодаря этому мы имеем возможность, например, внутри шаблонного класса использовать имя этого шаблонного класса без указания всех его параметров. Это избавляет нас от ненужного многословия при написании конструкторов копирования/перемещения, операторов присваивания п пр. А посколку имя открытое (public) мы имеем к нему доступ и снаружи. Ну и вложенность обращения тоже не запрещается:

http://coliru.stacked-crooked.com/a/87dfa6482e17b06e

static_assert(std::is_same_v<std::tuple<int, char*, double>, typename std::tuple<int, char*, double>::tuple::tuple::tuple::tuple>);


P.S. В некоторых случаях, таких как в моем примере, при обращении к injected-class-name требуется явное использование ключевого слова 'typename', чтобы отличить имя типа от конструктора. В других случаях, там где из контекста понятно, что это имя типа, использовение 'typename' не требуется.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 17.03.2020 7:00 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.