Импортирование std:: tr1 в std - это законно? Улучшает ли он мобильность?
У меня есть код С++ 03, который выглядит так:
#include <boost/tr1/unordered_map.hpp>
...
std::tr1::unordered_map<std::string, int> mystuff;
...
Я начал задаваться вопросом, что я буду страдать позже, если/когда я конвертирую свой код в С++ 11, который (я думаю) не имеет std::tr1::unordered_map
, но имеет std::unordered_map
. Поэтому я придумал следующий хак:
namespace std
{
using namespace ::std::tr1;
}
...
std::unordered_map<std::string, int> mystuff; // no tr1 now!
...
Является ли это законным (возможно, импорт материалов в std
запрещен)? Будет ли проще переносить/взаимодействовать с кодом С++ 11?
Ответы
Ответ 1
Вы не должны касаться пространства имен std
: даже если он работает сейчас, это может привести к серьезным головным болям позже (с новой версией компилятора, на другом компиляторе и т.д.).
Обновление: Цитата из стандарта (С++ 2003, раздел 17.4.3.1 "Зарезервированные имена" ) (найдено здесь):
undefined для программы на С++ добавлять объявления или определения в пространство имен std или пространства имен в пространстве имен std, если не указано иное. Программа может добавлять специализированные шаблоны для любого стандартного шаблона библиотеки в пространство имен std. Такая специализация (полная или частичная) стандартного шаблона библиотеки приводит к поведению undefined, если декларация не зависит от пользовательского типа внешней привязки и если специализация не соответствует требованиям стандартной библиотеки для исходного шаблона. [акцент мой]
Ответ 2
Импорт материалов в ::std
запрещен С++ 11 17.6.4.2.1:
Поведение программы на С++ undefined, если оно добавляет объявления или определения в пространство имен std
или в пространство имен в пространстве имен std
, если не указано иное.
Ответ 3
Я думаю, этот вопрос очень похож на то, о чем вы просите.
В частности, мне нравится ответ, в котором говорится: "Используйте autoconf для определения доступности символов, а затем используйте условные определения для псевдонима правильного пространства имен с заданным именем".
Ответ 4
Этот вид переносимости должен быть предпринят только в том случае, если у вас есть доказательство того, что вы не можете поддерживать определенную библиотеку более четко, и в идеале вы должны окружить его #ifdef
, специфичным для этой конкретной среды.
Точкой tr1
было выделение вашего std
из материала в tr1
.