Сообщение 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
_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
P.S. В некоторых случаях, таких как в моем примере, при обращении к injected-class-name требуется явное использование ключевого слова 'typename', чтобы отличить имя типа от конструктора. В других случаях, там где из контекста понятно, что это имя типа, использовение 'typename' не требуется.
_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' не требуется.