As the above header will be removed in C++20 and at the same time a like some bits of it (for clarity), I defined not/or/and myself. This triggers the following warnings:
./uniform_int_distribution_fast.hpp(99): warning : C++ operator ‘not’ (aka ‘!’) used as a macro name [-Wmicrosoft-cpp-macro]
./uniform_int_distribution_fast.hpp(100): warning : C++ operator ‘and’ (aka ‘&&’) used as a macro name [-Wmicrosoft-cpp-macro]
./uniform_int_distribution_fast.hpp(101): warning : C++ operator ‘or’ (aka ‘||’) used as a macro name [-Wmicrosoft-cpp-macro]
I’m confused now, not including ciso646 and removing those defines compiles my code with clang-cl-8.0, also with -std=c++17 (and -std=c++2a), while the same code does not compile with vc-15.8.1 (-std:latest), un-surprisingly. At the same time the warning talks about “operator not” as if it became a language keyword (in C++20). Unfortunately the books on C++20 are thin on the ground and cppreference.com mixes the old with the new and is not clear at all about it, except that ciso646 has gone the way of the dodo.
So, if the compiler conforms to the std, and/or/not etc are keywords (and have been so for 20 years :-)) )? If not already filed, I’ll file a bug than.
Just for entertainment, I went to file a bug, and indeed somebody filed a bug in august 2017, the issue was closed 1 day later “Not a bug”, advice: “include ciso646”, funny buggers. I took alternative action.
Just for completeness. It appears that, in an upside down way (for the moment), this is supported now, compiling with /permissive- will do the correct thing (i.e. turning something off, the ms-extensions, turns alternative tokens on).