Подтвердить что ты не робот

Альтернативные реализации STL в С++ 11 и более поздних версиях

С течением времени появились различные альтернативные реализации STL *, такие как STLPort. Некоторые крупные корпорации также используют собственный внутренний порт STL для различных целей.

С С++ 03 можно написать порт STL, используя только переносимые возможности языка С++, что означает, что любой соответствующий компилятор должен скомпилировать его.

Но с С++ 11 нет определенных функций, которые требуют поддержки компилятора?

Например, я не вижу, как std::is_standard_layout может быть реализовано с использованием только функций языка С++. Я думаю, что std::is_base_of может быть реализовано в терминах std::is_convertible, используя базовые и производные указатели. Но я не могу представить, как реализовать std::is_standard_layout. Могут быть и другие функции, которые мне не приходили.

Итак, я исправлю здесь? Невозможно ли написать полный порт стандартной библиотеки в С++ 11, используя только функции языка С++?

* Я знаю, что STL и "стандартная библиотека С++" не являются строго взаимозаменяемыми, но, очевидно, я имею в виду С++ Standard Libary в этом случае.

4b9b3361

Ответ 1

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

Общая идея стандартной библиотеки С++ заключается в том, что она охватывает общие потребности и реализует некоторые функции, которые невозможно реализовать портативно и эффективно. Типичные черты, которые вы цитировали, являются лишь некоторыми примерами, когда компиляторы должны предоставить некоторую помощь. Несмотря на то, что я пытался получить некоторое согласие относительно того, как компиляторы обнаруживают признаки типа, авторы компиляторов настаивали на том, что им нужно быть свободными от своих выборов и что стандартная библиотека С++ должна просто дать общий интерфейс тому, как отображаются признаки.