Pode-se acessar as funções de membros privados através de conversão para tipos compatíveis com layout?

Da discussão desta questãoComo o acesso para variáveis ​​privadas é implementado em C ++ sob o capô? Eu postei uma variação: em vez de acessar um membro de dados privados, pode-se chamar funções de membros privados através de conversão e confiando na compatibilidade de layout?

Algum código (inspirado na coluna de Herb SutterUsos e abusos de direitos de acesso )

#include <iostream>

class X 
{ 
public:
  X() : private_(1) { /*...*/ }

private: 
  int Value() { return private_; }
  int private_; 
};

// Nasty attempt to simulate the object layout
// (cross your fingers and toes).
//
class BaitAndSwitch
    // hopefully has the same data layout as X
{   // so we can pass him off as one
public:
  int Value() { return private_; }
private:
  int private_;
};

int f( X& x )
{
  // evil laughter here
  return (reinterpret_cast<BaitAndSwitch&>(x)).Value();
}

int main()
{
    X x;
    std::cout << f(x) << "\n"; // prints 0, not 1
    return 0;
}; 

Nota: isso funciona (pelo menos no Ideone)! Existe alguma maneira do novoC ++ 11 Standard dá umgarantido ou pelo menos umimplementação definida maneira de contornar o controle de acesso, baseando-se em compatibilidade de layout e reinterpret_cast / static_cast?

EDIT1: saída emIdeone

EDIT2: Na coluna de Sutter, ele lista duas razões pelas quais o código acima não tem garantia de funcionar (embora funcione na prática)

a) Os layouts de objetos de X e BaitAndSwitch não têm garantia de serem os mesmos, embora, na prática, provavelmente sempre sejam.

b) Os resultados do reinterpret_cast são indefinidos, embora a maioria dos compiladores permita que você tente usar a referência resultante da maneira que o hacker pretendia.

O novo C ++ 11 Standard agora fornece estas garantias layout / reinterpret_cast?

questionAnswers(1)

yourAnswerToTheQuestion