#include <iostream>
#include<new>
#include<vector>
class Singleton
{
private:
Singleton() = default;
~Singleton() = default;
public:
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
void* operator new(std::size_t) = delete;
void* operator new[](std::size_t) = delete;
void operator delete(void*) = delete;
void operator delete[](void*) = delete;
static const Singleton& getInstance()
{
static Singleton mySingleton;
return mySingleton;
}
void foo() const
{
std::cout << this;
}
};
int main(int argc, const char *argv[])
{
const Singleton& s1 = Singleton::getInstance();
// Why does this compile?
std::vector<Singleton> v(2);
v.front().foo();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxuZXc+CiNpbmNsdWRlPHZlY3Rvcj4KCmNsYXNzIFNpbmdsZXRvbgp7CiAgICBwcml2YXRlOgogICAgICAgIFNpbmdsZXRvbigpID0gZGVmYXVsdDsgCiAgICAgICAgflNpbmdsZXRvbigpID0gZGVmYXVsdDsgCgogICAgcHVibGljOiAKCiAgICAgICAgU2luZ2xldG9uKGNvbnN0IFNpbmdsZXRvbiYpID0gZGVsZXRlOyAgCiAgICAgICAgU2luZ2xldG9uJiBvcGVyYXRvcj0oY29uc3QgU2luZ2xldG9uJikgPSBkZWxldGU7CgogICAgICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCkgPSBkZWxldGU7CiAgICAgICAgdm9pZCogb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3QpID0gZGVsZXRlOwoKICAgICAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKikgPSBkZWxldGU7CiAgICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKikgPSBkZWxldGU7CgogICAgICAgIHN0YXRpYyBjb25zdCBTaW5nbGV0b24mIGdldEluc3RhbmNlKCkKICAgICAgICB7CiAgICAgICAgICAgIHN0YXRpYyBTaW5nbGV0b24gbXlTaW5nbGV0b247CgogICAgICAgICAgICByZXR1cm4gbXlTaW5nbGV0b247IAogICAgICAgIH0KICAgICAgICAKICAgICAgICB2b2lkIGZvbygpIGNvbnN0CiAgICAgICAgewogICAgICAgIAlzdGQ6OmNvdXQgPDwgdGhpczsKICAgICAgICB9Cn07CgoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKewogICAgY29uc3QgU2luZ2xldG9uJiBzMSA9IFNpbmdsZXRvbjo6Z2V0SW5zdGFuY2UoKTsgCgogICAgLy8gV2h5IGRvZXMgdGhpcyBjb21waWxlPwogICAgc3RkOjp2ZWN0b3I8U2luZ2xldG9uPiB2KDIpOwogICAgCiAgICB2LmZyb250KCkuZm9vKCk7CgogICAgcmV0dXJuIDA7Cn0=