Это интересно - (. 17.4.1.1 Библиотека содержимого) стандарт действительно говорит, что
Все библиотеки субъектов, кроме макросов, оператор новый и оператор удалять определяются в станд пространства имен или пространств имен, вложенных в пределах пространства имен Std.
И ясно говорит, что (идентификация 5.2.8 Type)
Результат выражения TypeID является именующей статическим типом сопзЬ станд :: type_info (18.5.1) и динамического типа Const станд :: type_info или const name, где name - это определенный реализацией класс, полученный из std :: type_info, который сохраняет поведение, описанное в 18.5.1.
Ans, конечно, descriptin заголовка <typeinfo?>
указывают на то, что должно быть в пространстве имен std
(18,5 идентификационным Тип):
Заголовок <typeinfo>
синопсис
namespace std {
class type_info;
class bad_cast;
class bad_typeid;
}
Так type_info
должен находиться в пространстве имен std
(а не за его пределами). Я предполагаю, что либо это ошибка, либо есть большой набор кода (или небольшой набор важного кода), который нуждается в нем за пределами пространства имен std
. Я бы подумал, что они используют некоторую магию препроцессора, чтобы вы могли заставить ее быть в пространстве имен std
, если хотите (или наоборот), по умолчанию сделать это в std
и разрешить макрос или что-то его принудительное к глобальному пространству имен).
Однако, один дополнительный морщин для type_info
является то, что это результат оператора typeid
(точнее, то, что происходит от type_info
результата), так что, вероятно, жесткая зависимость от того, что делает компилятор для оператора typeid
, что библиотека должна соответствовать.Таким образом, тот факт, что type_info
не находится в пространстве имен std
, возможно, объясняется тем, что делает компилятор с выражениями typeid
, и, возможно, у библиотек есть небольшой контроль над этим (и я бы предположил, что это одна из причин, по которой не существует способа обхода метода preprocssor для проблема). Тот, кто знает намного больше о том, как работают компиляторы, чем я, должен был бы объяснить это лучше (или вывести его за рамки спекуляций).
Но я думаю, вам придется попросить кого-нибудь в Microsoft (или PJ Plauger/Dinkumware) для реального ответа на вопрос «почему».
OK Я нашел комментарий в файле типаinfo. Parafracing, он сказал, что «type_info не входит в std namespace, поскольку компиляторы RTTI часто имеют собственную имплементацию». Я решил это, просто переместив его в std, против рекомендации в комментарии. – Rolle
Не могли бы вы дать немного больше информации о местоположении этого комментария и/или версии компилятора для заголовка '', в котором вы его видели? –
Только в начале файла, под всеми включает в себя и прагма-вызов. Файл предназначен для wince 6, и, вероятно, он появился либо с Platform Builder, либо с заранее построенным SDK когда-то давно. Это авторское право Microsoft. Вот полный комментарий: // Тип возврата из оператора typeid в соответствии со стандартом // это действительно должно быть в пространстве имен std, но компилятор // имеет встроенные знания об этом классе. Не изменяйте // ничего здесь, не проверяя расположение информации RTTI // сгенерированный компилятором. – Rolle