Comment #0 by ali.akhtarzada — 2019-07-29T22:32:23Z
import std;
struct W(T) {
T value;
auto hook(handlers...)() {
return handlers[0](value);
}
}
template f(handlers...) {
auto ref f(T)(auto ref T value) {
return value.hook!handlers;
}
}
@nogc void main() {
auto a = W!int(3);
auto b = a.f!((_) => "yes");
}
Produces: Error: @nogc function D main cannot call non-@nogc function onlineapp.main.f!(W!int).f
Adding @nogc on function f says hook!((_) => "yes").hook closes over variable __this310
If you explicitly specify a type on the lambda that you pass to f then it compiles:
auto b = a.f!((int) => "yes");
Comment #1 by ali.akhtarzada — 2019-07-29T23:21:16Z
f's instantiation with untyped lambda:
f!(W!int)
{
auto pure nothrow @safe string f(ref W!int value)
{
return (void*[2] __this3 = null;) , value.hook();
}
}
With typed lambda:
f!(W!int)
{
auto pure nothrow @nogc @safe string f(ref W!int value)
{
return value.hook();
}
}
Comment #2 by robert.schadek — 2024-12-13T19:04:45Z