Size: a a a

Compiler Development

2021 May 04

AT

Alexander Tchitchigi... in Compiler Development
Методы объектов, к слову являются замыканиями — что широко известно — поскольку захватывают "локальные переменные": поля объекта (инстанса класса). По этой причине в C++ на раз отстреливаются ноги при возврате/охранении указателей на методы объектов, алоцированных на стеке. Или просто недостаточно долго живущих.
источник

Т8

Т-34 85 in Compiler Development
Благо, можно захватить не по ссылке, а по значению
источник

P

Pavel in Compiler Development
А также (в сишарпе) замыкание становится методом объекта, а захваченные переменные его полями
источник

ДК

Дмитрий К in Compiler Development
Ссылка на метод объекта в D это не боле чем структура из ссылки на объект и ссылки на функцию.
источник

D

Danya in Compiler Development
Не очень понял про указатели на методы объектов, аллоцированных на стеке
Можно пример?
источник

AT

Alexander Tchitchigi... in Compiler Development
А что там сложного?
struct A {
 int x;
 int foo(int y) { return x + y; }
}

int (* A::foo)(int) p; // или как там указатели на методы объявляются?

void bar() {
 A a;
 a.x = 10;
 p = &a.foo; // Oops...
}
источник

卜根 in Compiler Development
а вот Delphi-то со счётчиком ссылок захватывает
источник

D

Danya in Compiler Development
Я не уверен, что &a.foo даст указатель на метод
Ведь &a.x даст не указатель на поле, а просто указатель
С другой стороны непонятно что там другое должно быть
источник

D

Danya in Compiler Development
Указатели на методы в С++ не захватывают this
источник

D

Danya in Compiler Development
Вот это я точно могу сказать
источник

D

Danya in Compiler Development
auto foo_ptr = &A::foo;
a.*foo_ptr(42);
источник

D

Danya in Compiler Development
this надо самим предоставлять
источник

AT

Alexander Tchitchigi... in Compiler Development
В смысле? Что значит "&a.x даст не указатель на поле, а просто указатель"?
По стандарту C++ взятие указателя на метод объекта даёт указатель на метод объекта, как ни странно. Замыкая до кучи указатель именно на объект чтобы можно было сделать вызов по указателю, передав только аргументы.
источник

AT

Alexander Tchitchigi... in Compiler Development
Захватывают. Если это именно указатели на методы, а не просто на функции.
источник

D

Danya in Compiler Development
Тип &а.хint*, а не int A::*
источник

D

Danya in Compiler Development
Тогда зачем нужны операторы .* и ->* ?)
источник

AT

Alexander Tchitchigi... in Compiler Development
Это просто потому, что члены класса, которые НЕ функции своего окружения не замыкают, по понятным причинам. 😂
источник

AT

Alexander Tchitchigi... in Compiler Development
Не знаю таких составных операторов. 🤷‍♀️
источник

AT

Alexander Tchitchigi... in Compiler Development
А в C++ &A::foo и &a.foo — не одно и то же. 🤷‍♀️
источник

AT

Alexander Tchitchigi... in Compiler Development
Впрочем, пишу по памяти — давно не работал с C++, и не хочется, так что проверьте по актуальному стандарту кому не лень.
источник