Небольшая предыстория:
Расширение 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
?
mystd
или что-то в этом роде. Тогда вам не придется решать ни один из этих вопросов. - person Barry   schedule 08.02.2018std_
решению - person AMA   schedule 08.02.2018typename = std::enable_if<....>
вместо этого используйте enable_if, расположенный где-то еще? В подписях нетusing
. Это только один случай. Что касается того, является ли это UB, делайте то, что делает компилятор, и вы в лучшем случае будете таким же UB, как и они. - person Luis Machuca   schedule 22.01.2019