https://issues.dlang.org/show_bug.cgi?id=17953
Bastiaan Veelo <basti...@veelo.net> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |basti...@veelo.net --- Comment #2 from Bastiaan Veelo <basti...@veelo.net> --- This came up again at the DLF quarterly meeting April 5, 2024, with industry partners, and Walter asked to make sure there is a feature request. As discussed there: For arguments and return types of various mutability we have the `inout` keyword that saves us from having to define multiple function overloads[1]. A similar solution for other attributes does not exist. For example, if you have foreach loops over a struct S both in a @nogc context and with an allocating loop body, ```d void f() { S s; foreach (a; s) allocating(a); } void g() @nogc { S s; foreach (a; s) nonallocating(a); } void allocating(int) {} void nonallocating(int) @nogc {} ``` then S needs both of these opApply overloads: ```d int opApply(scope int delegate(int) dg); int opApply(scope int delegate(int) @nogc dg) @nogc; ``` Similar for @safe, nothrow, pure and their permutations. Templating opApply[2] can help in many of these cases, but problems arise when classes and inheritance get involved[3]. There is a DIP for argument dependent attributes[4] but work on it has stalled. [1] https://dlang.org/spec/const3.html#inout [2] https://dlang.org/spec/statement.html#template-op-apply [3] https://youtu.be/9lOtOtiwXY4?si=KME_ZddnrecMdWOJ&t=359 [4] https://github.com/dlang/DIPs/pull/198 --