Можно ли получить доступ к закрытым функциям-членам путем приведения к макету -совместимых типов?

Из обсуждения этого вопроса Как доступ к закрытым переменным реализован в C++ под капотом? Я представил вариант :вместо доступа к частному члену данных: можно ли вызывать частные функции-члены посредством приведения и опираясь на совместимость макета -?

Некоторый код (, вдохновленный колонкой Херба Саттера Использование и злоупотребление правами доступа)

#include 

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(x)).Value();
}

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

Обратите внимание :это работает (по крайней мере на Ideone )! Есть ли способ, которым новый стандарт C++11 дает гарантированный или, по крайней мере, реализацию -определенный способ обойти контроль доступа, полагаясь на компоновка -совместимость и реинтерпретация _приведение / статическое _приведение?

РЕДАКТИРОВАТЬ1:вывод на Идеоне

РЕДАКТИРОВАТЬ2:В колонке Саттера он перечисляет две причины, по которым приведенный выше код не гарантирует работу (, хотя на практике он работает )

a) The object layouts of X and BaitAndSwitch are not guaranteed to be the same, although in practice they probably always will be.

b) The results of the reinterpret_cast are undefined, although most compilers will let you try to use the resulting reference in the way the hacker intended.

. Предоставляет ли теперь новый стандарт C++11 эти гарантии приведения компоновки/реинтерпретации _?

6
задан Community 23 May 2017 в 11:45
поделиться