Информация об изменениях

Сообщение Re[6]: Неправильная кодогенерация, MSVC 2017 от 17.03.2020 6:48

Изменено 17.03.2020 7:00 rg45

Re[6]: Неправильная кодогенерация, MSVC 2017
Здравствуйте, Коваленко Дмитрий, Вы писали:

_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>);
Re[6]: Неправильная кодогенерация, MSVC 2017
Здравствуйте, Коваленко Дмитрий, Вы писали:

_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' не требуется.