On 8/24/2011 1:08 PM, Paul wrote:
Please provide some concrete facts that support your claim and it will
be investigated.
Marcel has already provided a compact example that causes Microsoft
compiler to exhibit incorrect behavior. I'll reproduce an equivalent
example here in more compact form
#include <iostream>
struct tbase {
int x;
tbase() : x(42) {}
};
struct test : tbase {
virtual ~test() {}
void f() { std::cout << "x=" << x << "\n"; }
};
int main() {
void (tbase::*p)() = static_cast<void (tbase::*)()>(&test::f);
test t;
(t.*p)();
}
This code works incorrectly in MSVC++ 2005 and MSVC++ 2010. Function
`test::f` called indirectly by `(t.*p)()` call receives incorrect value
of `this` pointer, which leads to incorrect value of `x` being printed.
This happens regardless of the compiler settings.
The compiler understands in advance that the code will not work. It
issues a warning
warning C4407: cast between different pointer to member representations,
compiler may generate incorrect code
in response to the above `static_cast`. This is, of course, not an
excuse, since the language standard requires this code to work correctly.
MSVC++ compilers have quite a few blatant standard violations. I collect
them in my "notebook" here
to be derived from.