Чистя OpenCLABC
от костылей, в связи с исправлениями нескольких багов - я написал эту строчку:
if (prev_ev<>cl_event.Zero) or (Func0&<T>(self.f) <> nil) then
(self.f
имеет тип ()->T
)
Но потом задумался, а надо ли там явное преобразование к Func0
, чтоб удостоверится что идёт проверка - содержит ли self.f
значение. То есть чтоб там был точно НЕ вызов. И - таки нет, не нужно. Но просто убирать преобразование я боюсь, вдруг в будущем изменится. А компилироваться от этого код не перестанет, вместо этого получим неопределённое поведение, которое фиг отследишь. В связи с этим:
Предлагаю определится и записать куда то типа справки - что происходит если у функции без параметров не поставить скобки. Когда вызов, а когда получение ссылки?
На сколько я понимаю как работает сейчас - есть 2 поведения:
- Если написано имя функции
- Если написано имя переменной, которая является ссылкой на функцию
В обычной ситуации, для имени функции - происходит вызов, а для переменной - получение ссылки.
Особая ситуация (с поведением - противоположным обычному) происходит тогда, когда тип, получаемый обычным поведением - не подходит:
function f: object;
begin
writeln('вызов');
Result := nil;
end;
begin
// особые ситуации:
var v: ()->object := f; // точно получение ссылки, потому что тип переменной указали явно
var o: object := v; // точно вызов, по той же причине
// обычные ситуации:
writeln(f = nil); // точно вызов, потому что имя функции, а в выражение можно подставить и object и ()->object
writeln(v = nil); // точно получение ссылки, потому что v - переменная
end.
@Admin, @ibond это поведение такое - как вы задумывали, или где то тут ошибка?
И в любом случае, после этого ответа - есть ещё несколько каверзных вопросов по ситуации, включая некоторые осложнения с where
и не только.