Сообщение Re[4]: Инжектирование друзей класса в охватывающее пространс от 10.01.2022 21:09
Изменено 10.01.2022 21:12 Андрей Тарасевич
Re[4]: Инжектирование друзей класса в охватывающее пространство имен
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Андрей Тарасевич, Вы писали:
NB>>>а какое linkage у таких функций?
АТ>>External, вестимо. Никаких предпосылок ни для какого другого linkage в этих примерах нет.
NB>да, нашел
NB>>>ну и попутно вопрос, корректно ли в принципе делать такие функции не зависящими от включающего их типа внешнего типа?
АТ>>Хм... Вроде корректно. Мне никакие ограничения по этому поводу не известны.
NB>тогда пример сводится к случаю:
NB>
NB>насколько помню, в С++03 это вроде было ОДР, но всем было пофиг.
Как же это он сводится?
Суть моего вопроса фактически заключается в следующем: считается ли инжектированное определение `foo` неявно зависящим от шаблонного параметра `T`. Зависящим настолько существенно, что определения `foo` в разных единицах трансляции, инжектированные разными специализациями шаблона `S`, нарушают требования ODR.
Фактически мне просто лень было рыться в стандарте и надеялся, что кто-то мне сразу подкинет ссылку. Сейчас, прочитав http://eel.is/c++draft/basic.def.odr#13 внимательно, я прихожу к выводу, что мои предположения верны. Множественные определения `foo` соответствует требованиям, налагаемым ODR на inline-функции, а множественные определения `bar` — не соответствуют. Диагностика для `bar` не требуется, согласно http://eel.is/c++draft/basic.def.odr#15
По-прежнему может быть кто-то найдет релевантные уточняющие ссылки в разделах о шаблонах.
NB>Здравствуйте, Андрей Тарасевич, Вы писали:
NB>>>а какое linkage у таких функций?
АТ>>External, вестимо. Никаких предпосылок ни для какого другого linkage в этих примерах нет.
NB>да, нашел
NB>>>ну и попутно вопрос, корректно ли в принципе делать такие функции не зависящими от включающего их типа внешнего типа?
АТ>>Хм... Вроде корректно. Мне никакие ограничения по этому поводу не известны.
NB>тогда пример сводится к случаю:
NB>
NB>struct T {};
NB>inline void foo () {
NB> T t{};
NB> std::cout << t;
NB>}
NB>
NB>насколько помню, в С++03 это вроде было ОДР, но всем было пофиг.
Как же это он сводится?
Суть моего вопроса фактически заключается в следующем: считается ли инжектированное определение `foo` неявно зависящим от шаблонного параметра `T`. Зависящим настолько существенно, что определения `foo` в разных единицах трансляции, инжектированные разными специализациями шаблона `S`, нарушают требования ODR.
Фактически мне просто лень было рыться в стандарте и надеялся, что кто-то мне сразу подкинет ссылку. Сейчас, прочитав http://eel.is/c++draft/basic.def.odr#13 внимательно, я прихожу к выводу, что мои предположения верны. Множественные определения `foo` соответствует требованиям, налагаемым ODR на inline-функции, а множественные определения `bar` — не соответствуют. Диагностика для `bar` не требуется, согласно http://eel.is/c++draft/basic.def.odr#15
По-прежнему может быть кто-то найдет релевантные уточняющие ссылки в разделах о шаблонах.
Re[4]: Инжектирование друзей класса в охватывающее пространс
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Андрей Тарасевич, Вы писали:
NB>>>а какое linkage у таких функций?
АТ>>External, вестимо. Никаких предпосылок ни для какого другого linkage в этих примерах нет.
NB>да, нашел
NB>>>ну и попутно вопрос, корректно ли в принципе делать такие функции не зависящими от включающего их типа внешнего типа?
АТ>>Хм... Вроде корректно. Мне никакие ограничения по этому поводу не известны.
NB>тогда пример сводится к случаю:
NB>
NB>насколько помню, в С++03 это вроде было ОДР, но всем было пофиг.
Как же это он сводится?
Суть моего вопроса фактически заключается в следующем: считается ли инжектированное определение `foo` неявно зависящим от шаблонного параметра `T`. Зависящим настолько существенно, что определения `foo` в разных единицах трансляции, инжектированные разными специализациями шаблона `S` (т.е. для разных значений `T`), нарушают требования ODR.
Фактически мне просто лень было рыться в стандарте и надеялся, что кто-то мне сразу подкинет ссылку. Сейчас, прочитав http://eel.is/c++draft/basic.def.odr#13 внимательно, я прихожу к выводу, что мои предположения верны. Множественные определения `foo` соответствует требованиям, налагаемым ODR на inline-функции, а множественные определения `bar` — не соответствуют. Диагностика для `bar` не требуется, согласно http://eel.is/c++draft/basic.def.odr#15
По-прежнему может быть кто-то найдет релевантные уточняющие ссылки в разделах о шаблонах.
NB>Здравствуйте, Андрей Тарасевич, Вы писали:
NB>>>а какое linkage у таких функций?
АТ>>External, вестимо. Никаких предпосылок ни для какого другого linkage в этих примерах нет.
NB>да, нашел
NB>>>ну и попутно вопрос, корректно ли в принципе делать такие функции не зависящими от включающего их типа внешнего типа?
АТ>>Хм... Вроде корректно. Мне никакие ограничения по этому поводу не известны.
NB>тогда пример сводится к случаю:
NB>
NB>struct T {};
NB>inline void foo () {
NB> T t{};
NB> std::cout << t;
NB>}
NB>
NB>насколько помню, в С++03 это вроде было ОДР, но всем было пофиг.
Как же это он сводится?
Суть моего вопроса фактически заключается в следующем: считается ли инжектированное определение `foo` неявно зависящим от шаблонного параметра `T`. Зависящим настолько существенно, что определения `foo` в разных единицах трансляции, инжектированные разными специализациями шаблона `S` (т.е. для разных значений `T`), нарушают требования ODR.
Фактически мне просто лень было рыться в стандарте и надеялся, что кто-то мне сразу подкинет ссылку. Сейчас, прочитав http://eel.is/c++draft/basic.def.odr#13 внимательно, я прихожу к выводу, что мои предположения верны. Множественные определения `foo` соответствует требованиям, налагаемым ODR на inline-функции, а множественные определения `bar` — не соответствуют. Диагностика для `bar` не требуется, согласно http://eel.is/c++draft/basic.def.odr#15
По-прежнему может быть кто-то найдет релевантные уточняющие ссылки в разделах о шаблонах.