Какова связь между «стиранием типа C ++» и «реконструкцией стирания/типа типа», как предназначено в теории типа?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Какова связь между «стиранием типа C ++» и «реконструкцией стирания/типа типа», как предназначено в теории типа?

Сообщение Anonymous »

tl; dr
Я знаю, что означает стирание типа в контексте C ++ (например, я могу реализовать игрушечную версию STD :: Любой сам), но это, кажется, совершенно иначе, чем экрас типа , как предполагается в теории типа (по крайней мере, в «Типах и программировании языков». /> Но, поскольку термины, по сути, одинаковы, за исключением квалификатора "c ++" < /em>, который мы используем в C ++, мне интересно, что мне не хватает более тесной связи между двумя вещами. < /p>

Следующее в §9.5 на страницах 109-110: < /p>

Большинство компиляторов для полномасштабных языков программирования фактически избегают переноса аннотаций во время выполнения: они используются во время Typechecking (и во время генерации кода, в более сложных компиляторах), но не появляются в составленной форме программы. По сути, программы преобразуются обратно в нетипированную форму до того, как они будут оценены. < /P>
< /blockquote>
Программа с хорошим типом, переписывайте его типовые аннотации произвольным образом и получите программу, которая ведет себя так же. По этим причинам во многих полиморфных языках вместо этого принимают воспользование типа type-erasure , где после фазы Typechecking все типы стерты и результирующие нетипированные термины интерпретируются или составлены в машинный код. связано с type rushure , и они очень похожи на дополнительные или обратные друг друга. Я имею в виду, при условии, что foo определяется как

Код: Выделить всё

struct Foo {
int i;
friend bool operator==(Foo, Foo) = default;
};
Две функции ниже компилируются с одной и той же сборкой, показывая, что нет никакого следа foo (или int fwiw, помимо того, что CMP EDI, 1 используется для сравнения int с буквальным 1 ) в runtime
" rainpride = "langIrInt =" langIrInt = "langIrInt =" langIrINT-CODIRID> "

Код: Выделить всё

bool equalTo1(Foo f) {
return Foo{1} == f;
}

bool equalTo1(int f) {
return 1 == f;
}
c ++ тип стирания
Когда я слышу c ++ -тип rushure , приходит довольно другая идея: я пишу код так, что тип данного объекта выполнения не может быть Статически , чтобы оцениваться в программе, но в одном или другой - на вершине выполнения, и в этом типе (как, и в одном из них, иначе подходит к типу. act означает вызов функции члена, копирование, уничтожение, вызов…; Переопределить S Первое и *f действительно является панелью , но я не могу сказать, что во время компиляции, потому что static_assert (std :: is_same_v ); будет проходить независимо от времени выполнения. /> < /li>
[*]

Код: Выделить всё

std::function
может хранить разные объекты, например, Свободные функции, функции -члены, без сохранения состояния, а также Lambdas состояния,…; Как только такая сущность хранится в std :: function мы не можем статически сказать, какой тип там, но вызов выполняется правильно, состояние (если вызов был состоящим в состоянии) сохраняется и используется,…

[*]

Код: Выделить всё

std::shared_ptr
s того же типа может на самом деле иметь удаления разных типов, но они правильно хранят (и используют, при распространении).

Код: Выделить всё

std::any
, например, std :: function ,…


(как) связаны? Используется, например. Или что еще.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -reconstru
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»