foo() calls the second overload of move(), rather than the first. It would appear that std::is_enum<PlayState::Value>::value is false, and I don't understand why.
true
true
false
true
Basic type Move()
D:\Dev\source\repos\BlackFly\Debug\X-101.exe (process 6900) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
unless of course this is some sort of April fools 'joke' to get people to waste there time with pointless japes...
When I put the code in there was a bit of moaning about the logical comparison: Warning clang-diagnostic-logical-op-parentheses '&&' within '||'
and a warning from the first move() but I decided that just the uninitialized x, y that was being passed. Warning clang-analyzer-core.uninitialized.Assign Assigned value is garbage or undefined
If MSVC cannot distinguish the two templates, it may interpret your code as a violation of the one definition rule. This could explain why the wrong function is being called.
I'm convinced that you've written correct code in terms of the standard.
I'd love more information about this - if anyone knows better, please share.