Ответ 1
Вы не можете написать полностью переносимую стандартную реализацию библиотеки С++ в любой версии С++! FIrst из всех, некоторые стандартные компоненты библиотеки С++ четко абстрагируют специфику системы. Например, потоки файлов абстрагируют доступ к доступу к файлу. Да, вы можете использовать FILE*
под капотом, но я считаю, что стандартная библиотека C является частью стандартной библиотеки С++, и переносимая реализация также должна включать эту часть. Кроме того, определенные типы на самом деле зависят от компилятора, например, потому что существует языковое взаимодействие с ними. Например, std::bad_cast
вызывается в результате dynamic_cast<...>()
. Кроме того, некоторые стандартные компоненты библиотеки С++ должны использовать известные сведения о макете памяти и что reinterpret_cast<...>()
выполняет правильную тему. В других случаях стандартная библиотека задает значения, которые нельзя определить переносимыми, например, некоторые из полей std::numeric_limits<T>
.
Общая идея стандартной библиотеки С++ заключается в том, что она охватывает общие потребности и реализует некоторые функции, которые невозможно реализовать портативно и эффективно. Типичные черты, которые вы цитировали, являются лишь некоторыми примерами, когда компиляторы должны предоставить некоторую помощь. Несмотря на то, что я пытался получить некоторое согласие относительно того, как компиляторы обнаруживают признаки типа, авторы компиляторов настаивали на том, что им нужно быть свободными от своих выборов и что стандартная библиотека С++ должна просто дать общий интерфейс тому, как отображаются признаки.