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

Функции библиотеки С++ 11, зависящие от специфических для компилятора прокси

Мне было доведено до сведения проб и ошибок, что есть функции certian С++ 11, которые зависят от какой-то магии компилятора (TM). Я возился с реализацией собственного стандартного стандартного stdlib. Я знаю, что есть легкодоступные реализации stdlib, но это больше моя личная версия для небольших приложений.

Вчера вечером я реализовал std::initializer_list в соответствии со спецификацией, и у меня возникли проблемы с ее работой, я искал высокий и низкий для анонимников только для того, чтобы оставить заявления, что это невозможно, и что для компилятора потребуются изменения сам. Хорошо, я решил взглянуть на текущую реализацию libstdc++, и, конечно же, моя реализация была точно такой же, как и в дизайне, немного по-разному по краям, я потратил бессмысленные часы на выяснение, почему реализация не работала, когда он был точно таким же, как и в libstdc++. Это было не до шести часов, прежде чем я понял, что это должно быть в пространстве имен std. Оказывается, реализация представляет собой прокси-сервер для компилятора, который делает возможным initializer_list, а сам компилятор ищет класс initializer_list в namespace std.

Мой вопрос в том, есть ли другие функции библиотеки, о которых я должен знать, для чего требуется какая-то специальная магия компилятора для работы, какие-либо скрытые прокси-соединения или секретная интуиция компилятора для любой из новых функций библиотеки С++ 11? Я хотел бы знать это заранее, чтобы я мог быть готов, когда я реализую другие функции, которые зависят от магии компилятора, вместо того, чтобы тратить целый день на то, чтобы понять это методом проб и ошибок; который может стать утомительным и довольно раздражающим.

Спасибо.

4b9b3361

Ответ 1

Функции в <exception> в основном связаны с компилятором.

Несколько <type_traits> запросов свойств невозможно или очень сложно реализовать без помощи компилятора. Даже те, которые просто сложны, могут сработать, когда компилятор родной stdlib преуспевает из-за "обмана". И, конечно же, они будут быстрее компилироваться.

Хотя возможно писать <iostream> таким образом, что cin и cout инициализируются автоматически при первом использовании, большинство компиляторов предпочитают обманывать и связывать их так, чтобы они были сначала в статической инициализации.

<typeinfo>, конечно, должен точно соответствовать ожидаемому компилятору.

Есть, вероятно, больше вещей, о которых я не знаю и не могу придумать.

Помимо stdlib "обмана" и, опираясь на компилятор, компилятор может также полагаться на нестандартные функции, существующие в stdlib. Таким образом, даже если вы реализуете все стандартные функции, вам, скорее всего, придется выполнять процедуры копирования-вставки для пешеходных таблиц исключений, обработки иерархии в виртуальных деструкторах и т.д.

Ответ 2

Все "магические" типы, необходимые компилятору, перечислены в их собственном специальном разделе спецификации С++ под названием "Библиотека поддержки языков". Очевидно, что если вы реализуете стандартную библиотеку С++, вы должны иметь стандартную копию. Списки инициализаторов находятся в этом разделе, а также type_info, <cstdint>, глобальные операторы new/delete, <exception> и т.д.

Не пытайтесь их реализовать; используйте то, что дает вам компилятор.