Я знаю, что означает стирание типа в контексте 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;
};
" rainpride = "langIrInt =" langIrInt = "langIrInt =" langIrINT-CODIRID> "
Код: Выделить всё
bool equalTo1(Foo f) {
return Foo{1} == f;
}
bool equalTo1(int f) {
return 1 == f;
}
Когда я слышу c ++ -тип rushure , приходит довольно другая идея: я пишу код так, что тип данного объекта выполнения не может быть Статически , чтобы оцениваться в программе, но в одном или другой - на вершине выполнения, и в этом типе (как, и в одном из них, иначе подходит к типу. act означает вызов функции члена, копирование, уничтожение, вызов…; Переопределить S Первое и *f действительно является панелью , но я не могу сказать, что во время компиляции, потому что static_assert (std :: is_same_v ); будет проходить независимо от времени выполнения. /> < /li>
[*]
Код: Выделить всё
std::function
[*]
Код: Выделить всё
std::shared_ptr
Код: Выделить всё
std::any
(как) связаны? Используется, например. Или что еще.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -reconstru