Consider the following C++14 code:
#include
#include
#include
struct NonStandardLayout
{
// ...
};
int main
I'm surprised no one has mentioned this cheap counterexample yet:
struct foo {
static foo f;
// might seem dubious but doesn't violate anything
void* operator new(size_t, void* p) {return &f;}
};
Demo on Coliru.
Unless a class-specific placement version is called, however, your assertion should hold. Both expressions have to represent the same address as explained in the other answer (the main point being that the standard non-allocating operator new
simply returns the pointer argument and the new expression not doing anything fancy), and neither of these is a pointer past the end of some object so, by [expr.eq]/2, they compare equal.