
First, I have to say, amazing job, and amazing reference. I don't believe that there's anything else like this on the web. Now just some thoughts. N.B. my assumption is that getting rid of the warning with code changes that don't obfuscate meaning is preferred to suppressing. Suggestion column: I would prefer that the this column tell me how to write my code differently to avoid the warning if possible. The Suppression column does a good job of telling me how to suppress. Suppression column: Wonderful! C4180 Surely instead of suggesting suppressing you would remove the meaningless qualifier? C4996 Microsoft deprecated these functions on their own (and they call themselves POSIX compliant), and replaced them with extremely dangerous replacements that they claim are safe. The replacement functions are non-POSIX and aren't available from other compilers, hence non-portable. These warnings should be suppressed. I believe that you can also suppress by defining _CRT_NONSTDC_NO_DEPRECATE before and undef'ing after to do a local suppression. C4800 Might suggest that they use a bool valued expression in the first place, i.e. instead of foo, foo!=0, or do a static cast to bool. This is at times indicative of real bugs, when people turn out to not be doing what they thought they were doing. Apparently this is one of my favorite bugs (by favorite I don't mean that I like it either!) C4506 Might suggest that they provide the definition;) Someone had mentioned a redesign of boost:noncopyable to work around the C4511 and C4512 warnings from deriving from boost:noncopyable. Is anyone looking into it? Is it even possible? It's a shame that this wonderful thing generates so much noise. If course, if you want to make a class uncopyable, rather than inheriting from boost:uncopyable, you could just make your own copy and assignment declarations privately and without definitions if you don't need them. It makes the class non-copyable without generating the warnings. If you have other causes of C451{0-2} see below: C4510/C4511/C4512 In general if you provide one of destructor, assignment operator, and copy constructor, then you need all three. The best fix is to provide the method. Providing a private declaration is a way of telling the compiler that you are sure your case is different--if it really is. These are all caused by either inaccessible base class version, or const or reference data members. Similar to 4511 and 4512 are the following which occur on trying to derive from a non-copyable class, i.e. one with the preceding issues--you will also get 4511 and 4512. C4625: copy constructor could not be generated because a base class copy constructor is inaccessible C4626: assignment operator could not be generated because a base class assignment operator is inaccessible C4701 Initialize the variable. (Does it give this warning for volatile? If it does it's a bug in the compiler. But you would need to suppress in that case.) C4702 If the code is really unreachable delete it. C4535 Does it give this warning even when /EHa is used? You mean that they're telling you to use something you are using? Wish I had Visual C++ here right now to try this one. It's a bug against the compiler if so. If /EH is not being used, it will cause memory leaks, so its use should be added to the tests of things that use this. I would suppress only if /EHa is used and warnings still printed.