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

Сообщение 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>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>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

По-прежнему может быть кто-то найдет релевантные уточняющие ссылки в разделах о шаблонах.