On Wednesday, 5 January 2022 at 22:42:14 UTC, Paul Backus wrote:
>On Wednesday, 5 January 2022 at 07:28:41 UTC, Timon Gehr wrote:
>How about something like opArgs, dealing specifically with this case? (i.e., a function call foo(x)
with a single argument is immediately rewritten to foo(x.opArgs)
if x
has a member opArgs
, and this rewrite is applied exactly once.)
This mechanism seems too powerful to me; for example, one could write code like the following:
struct S {
string opArgs;
}
string fun(S s) { return "S overload"; }
string fun(string s) { return "string overload"; }
void main() {
assert(fun(S()) == "S overload"); // fails
}
If there is to be any mechanism for automatic expansion of tuples, it should probably be narrow enough to avoid enabling surprises like this one.
Yeah, and what does "exactly once" mean here?
struct S {
string opArgs;
}
string fun(S s) { return "S overload"; }
string fun(string s) { return "string overload"; }
void main() {
S s = S();
assert(fun(s) == "string overload"); // succeeds
assert(fun(s) == "S overload"); // this also succeeds??
}