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 mixes the old with the new and is not clear at all about it, except that ciso646 has gone the way of the dodo.

Could someone please shed some light.


and/or/not etc. have always been alternative tokens in standard C++
all the way back to C++98 and not macros. MSVC is nonconforming in
this regard.

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.


and/or/not definition within a source is not also permitted in the
following compiler
with similar messages listed above :

[s@localhost ~]$ g++ --version
g++ (GCC) 8.1.1 20180712 (Red Hat 8.1.1-5)
Copyright (C) 2018 Free Software Foundation, Inc.

Mehmet Erol Sanliturk

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).