Расширение пространства имен std с помощью обратного кода

Небольшая предыстория:

Расширение namespace std является неопределённым поведением (UB), если это не специализация шаблона [1 ]:

Добавление объявлений или определений в пространство имен std или в любое пространство имен, вложенное в std, является неопределенным поведением, за некоторыми исключениями, указанными ниже.

Также есть вопросы по SO, в которых также говорится, что это UB и плохая идея [2, 3] .

Мы используем boost::tr1 на платформах, на которых нет tr1 поддержка (например, WinCE, WM). Boost делает именно это: внедряет свою реализацию в std::tr1, если tr1 не предоставлен.

Например, в boost/tr1/memory.hpp:

namespace std{ namespace tr1{ 
   using ::boost::bad_weak_ptr;
   using ::boost::shared_ptr;
   ...
} }

Мои вопросы:

  • Означает ли это, что это UB, если boost::tr1 используется с компиляторами, отличными от tr1?

  • В качестве альтернативы, можно ли внедрять бэкпорты в std, если разработчик следит за тем, чтобы бэкпорты были недоступны?

  • Если все в порядке, можно ли сделать еще один шаг и ввести boost::tr1 в std вместо std::tr1?


person AMA    schedule 08.02.2018    source источник
comment
Большая часть UB исходит из того факта, что реализации уже разрешено добавлять специализации и дополнительные перегрузки в пространство имен std. Если вы сделаете это тоже, будут конфликты. Boost просто может иметь свои трюки, санкционированные производителями компиляторов, и в этом случае это определяется реализацией, а не UB.   -  person Bo Persson    schedule 08.02.2018
comment
Просто... не делай этого. Вместо этого поместите вещи в пространство имен mystd или что-то в этом роде. Тогда вам не придется решать ни один из этих вопросов.   -  person Barry    schedule 08.02.2018
comment
@ Барри, кажется, да. Я сейчас склоняюсь к std_ решению   -  person AMA    schedule 08.02.2018
comment
Если идея состоит в том, чтобы бэкпортировать, то я бы сказал, что вы считаетесь разработчиком по определению, и поэтому вам неявно разрешено делать вещи в пространстве имен std; в противном случае вопрос спорный, поскольку альтернативой являются просто нефункциональные резервные копии: как бы вы сделали код в сигнатурах функций или параметрах шаблона, который использует, например: typename = std::enable_if<....> вместо этого используйте enable_if, расположенный где-то еще? В подписях нет using. Это только один случай. Что касается того, является ли это UB, делайте то, что делает компилятор, и вы в лучшем случае будете таким же UB, как и они.   -  person Luis Machuca    schedule 22.01.2019