On Tue, 26 Nov 2024 at 14:07, Thomas Madlener <thomas.madlener@xxxxxxxxx> wrote: >> >> > // But this DOES >> > if (!(a1 = a2)) return 1; >> >> >> In this case, if the use of == was an accident and you had intended to >> write !(a1 == a2) then the code would look the same (except for the >> missing '=' character). The "extra" parentheses here would have to be >> present because of the ! operator, so unlike the first case above, >> they are not redundant. > > > Thanks for the quick reply and explanation. That makes sense, and I didn't think about that. > >> The types involved (i.e. the fact that A::operator= is being called) >> are not relevant at all, as far as I know. The warning operates purely >> on the syntax and warns about the use of = where maybe == was >> intended. > > > OK. In that case the warning makes sense. I thought there was a bit more semantic analysis going on, but that would probably be rather hard to implement. > >> Using if ((!(a1 = a2))) suppresses the warning for this case. > > > Thanks for the hint. I was for now going for if (auto assign = (a1 = a2); !assign) which works, but is quite a bit of additional noise compared to your solution. > > Given your explanations and the proposed fix, I am actually happy with just implementing that. But I am also curious why it doesn't happen with c++17. I'm thoroughly puzzled, but I'll follow up when I get an answer.