Date: Mon, 10 Oct 2022 22:07:35 +0200
If this is the wrong mailing list, sorry, maybe you can redirect me to
the correct one.
Consider following program.
the correct one.
Consider following program.
---- namespace ns{ struct foo{ friend void bar(const foo&){} }; } void bar2(ns::foo& f){ bar(f); } auto lambda = [](ns::foo& f_){bar(f_);}; struct foo2{ ns::foo mf; void bar(){ bar(this->mf); // (1) auto& f2 = mf; [&f2]{bar(f2);}(); // (2) [](ns::foo& f_){bar(f_);}(mf); // (3) bar2(mf); // (4) lambda(mf); // 5 ns::bar(mf); // (6) ::bar(mf); // (7) } }; ---- 1) does not compile, tries to call this->bar, no great, but OK 2,3) Still tries to call this->bar, even if this has not been captured 4,5) Works 6,7) do not compile, as expected (tested with GCC, clang and MSVC) I understand why 1,4,5,6,7 behave as they do, but fail to see why 2 and 3 should not compile and call the hidden friend function. 4 and 5 are suboptimal workarounds because they need a new function, if the code is templated it needs to go in the header file, and thus leak an implementation detail, if 2 or 3 would work it would be possible to keep the workaround local. Or is there another way to tell the compiler not trying to call this->bar, without resorting to 6,7 as they do not work in this case? I tried finding the relevant part in the standard why 2 and 3 do not work, but failed to do so, can anyone pinpoint me in the right direction? Best Federico
Received on 2022-10-10 20:07:41